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.