La soluzione più semplice è anteporre gli zeri
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Tuttavia, questo non terrà conto dei caratteri alfa. Per gestire i personaggi alfa, dovresti sapere quanti potenziali personaggi alfa potresti avere. Se ce n'è uno, potresti fare qualcosa del tipo:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
AGGIUNTA
Prova:
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 sulla mia soluzione. Se è il caso che i caratteri alfabetici abbiano un significato speciale, come suggerito da Erick Robertson, dovresti suddividere i dati in colonne separate. La soluzione precedente gestirà solo due casi molto specifici:un valore tutto numerico, un valore con un singolo carattere alfabetico finale. Se i dati potrebbero avere più caratteri alfabetici o il carattere alfabetico a volte è posizionato in modo diverso dalla fine del valore, la mia soluzione non funzionerà. Inoltre, va notato che la mia soluzione causerà una scansione della tabella per valutare la stringa ordinabile su ciascun valore.
Se quello che cerchi è una soluzione rapida una tantum, allora il mio approccio funzionerà. Se stai cercando una soluzione a lungo termine, suddividi i dati in colonne separate, accetta l'ordinamento sciocco o aggiungi una colonna che determina l'ordinamento relativo per ciascun valore.