sql >> Base de Datos >  >> RDS >> Sqlserver

T-Sql - Ordenar por alfanumérico

La solución más fácil es anteponer ceros

Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)

Sin embargo, esto no tendrá en cuenta los caracteres alfabéticos. Para tratar con caracteres alfabéticos, necesitaría saber cuántos caracteres alfabéticos potenciales podría tener. Si hay uno, podrías hacer algo como:

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

ADICIÓN

Ejecución de prueba:

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

Una nota sobre mi solución. Si es el caso de que los caracteres alfabéticos tienen un significado especial, entonces, como sugirió Erick Robertson, debe dividir los datos en columnas separadas. La solución anterior solo manejará dos casos muy específicos:un valor completamente numérico, un valor con un solo carácter alfabético final. Si los datos pueden tener varios caracteres alfabéticos o el carácter alfabético a veces se coloca en una posición diferente al final del valor, mi solución no funcionará. Además, se debe tener en cuenta que mi solución provocará un escaneo de la tabla para evaluar la cadena que se puede ordenar en cada valor.

Si lo que busca es una solución rápida de una sola vez, entonces mi enfoque funcionará. Si está buscando una solución a largo plazo, divida los datos en columnas separadas, acepte el orden de clasificación ridículo o agregue una columna que dicte el orden de clasificación relativo para cada valor.