Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

T-Sql - Ordenar por alfanumérico


A solução mais fácil é pré-anexar zeros
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)

No entanto, isso não contará com caracteres alfa. Para lidar com caracteres alfa, você precisa saber quantos caracteres alfa em potencial você pode ter. Se houver um, você pode fazer algo como:
Select ...
From #Test
Order By Case
    When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
    Else Right('0000000000' + NumVal, 10)
    End

ADIÇÃO

Execução de teste:
If object_id('tempdb..#Test') is not null
    Drop Table #Test

Create Table #Test ( NumVal varchar(10) )
Insert #Test(NumVal) Values('02')
Insert #Test(NumVal) Values('03')
Insert #Test(NumVal) Values('1a')
Insert #Test(NumVal) Values('1b')
Insert #Test(NumVal) Values('10')
Insert #Test(NumVal) Values('11')

Select NumVal
From #Test
Order By Case
    When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
    Else Right('0000000000' + NumVal, 10)
    End

Results:
1a
1b
02
03
10
11

Uma nota sobre a minha solução. Se for o caso de o(s) caractere(s) alfabético(s) ter um significado especial, então, como Erick Robertson sugeriu, você deve dividir os dados em colunas separadas. A solução acima tratará apenas dois casos muito específicos:um valor totalmente numérico, um valor com um único caractere alfabético à direita. Se os dados puderem ter vários caracteres alfabéticos ou o caractere alfabético às vezes estiver posicionado diferente do final do valor, minha solução não funcionará. Além disso, deve-se notar que minha solução fará com que uma verificação de tabela avalie a string que pode ser solicitada em cada valor.

Se o que você procura é uma solução rápida e única, minha abordagem funcionará. Se você estiver procurando uma solução de longo prazo, divida os dados em colunas separadas, aceite a ordem de classificação boba ou adicione uma coluna que dite a ordem de classificação relativa para cada valor.