Pergunta

Eu tenho dados mistos i coluna nvarchar (palavras e números). Que é a maneira mais rápida de dados de classificação nesta coluna na Ordem numérica.

Exemplo Resultado:

  • 1
  • 2
  • 3
  • ...
  • 10
  • 11
  • ...
  • aaaa
  • aaab
  • b
  • ba
  • ba
  • ...
Foi útil?

Solução

Use esta:

ORDER BY
    CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
    column

Isso funciona como esperado.


Nota : Você diz que maneira mais rápida . Esta sql foi rápido para mim para produzir, mas os shows plano de execução de uma mesa-scan, seguido por um cálculo escalar. Isto poderia produzir um resultado temporário, contendo todos os valores da referida coluna com algumas colunas temporárias adicionais para os resultados isNumeric. Pode não ser rápido para executar.

Outras dicas

Se você deixou pad seus números com 0 do tipo e em que, você obterá os resultados desejados. Você precisa ter certeza de que o número de 0 é você almofada com fósforos o tamanho da coluna varchar.

Dê uma olhada neste exemplo ...

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')

Select * From @Temp
Order By Case When IsNumeric(Data) = 1 
              Then Right('0000000000000000000' + Data, 20) 
              Else Data End

Observe também que é importante quando se utiliza uma instrução case que cada ramo da instrução case retorna o mesmo tipo de dados, ou então você vai obter resultados incorretos ou um erro.

- Verifique se há existência
se existe (SELECT * FROM dbo.sysobjects onde [id] = object_id (N'dbo.t ') E OBJECTPROPERTY (id, N'IsUserTable') = 1)
drop table dbo.t
ir

- criar tabela de exemplo
criar dbo.t mesa (c varchar (10) não nulo)
SET NOCOUNT ON

- exemplo preencher a tabela
inserir em dbo.t (c) valores ( '1')
inserir em dbo.t (c) valores ( '2')
inserir em dbo.t (c) valores ( '3')
inserir dbo.t (c) valores ('10 ')
inserir em dbo.t (c) Os valores (11 '')
inserir em dbo.t (c) valores ( 'AAAA')
inserir em dbo.t (c) valores ( 'aaab')
inserir em dbo.t (c) valores ( 'b')
inserir em dbo.t (c) valores ( 'BA')
inserir em dbo.t (c) valores ( 'BA')

- devolver o
dados escolha c de dbo.t
ordem por caso quando IsNumeric (c) = 1 então 0 else 1 fim,
caso quando IsNumeric (c) = 1 então fundido (c como int) else 0 fim,
c

Você pode tratar os dados como alfanumérico ou numérico, não os dois ao mesmo tempo. Eu não acho que o que você está tentando fazer é possível, o modelo de dados não está configurado adequadamente.

Eu não acho que o que você está tentando fazer É possível

Este exemplo funciona bem

SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END

resultado é:

  • a
  • b
  • c
  • ...
  • 1
  • 2
  • 3

Mas eu preciso de números em primeiro lugar.

Isso deve funcionar:

select * from Table order by ascii(Column)

lançá-lo.

SELECT * FROM foo ORDER BY CAST(somecolumn AS int);

Foi um tempo desde que eu toquei SQL Server, então minha sintaxe pode ser totalmente incorreta embora:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top