Den nemmeste løsning er at forudsætte nuller
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Dette vil dog ikke tage højde for alfategn. For at kunne håndtere alfategn, skal du vide, hvor mange potentielle alfategn du måtte have. Hvis der er en, kan du gøre noget som:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
TILFØJELSE
Testkørsel:
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
En note om min løsning. Hvis det er tilfældet, at det eller de alfabetiske tegn har en særlig betydning, bør du, som Erick Robertson foreslog, opdele dataene i separate kolonner. Ovenstående løsning vil kun håndtere to meget specifikke tilfælde:en helt numerisk værdi, en værdi med et enkelt efterfølgende alfabetisk tegn. Hvis dataene kan have flere alfabetiske tegn, eller hvis det alfabetiske tegn nogle gange er placeret anderledes end slutningen af værdien, vil min løsning ikke fungere. Derudover skal det bemærkes, at min løsning vil forårsage en tabelscanning for at evaluere den ordre-bare streng på hver værdi.
Hvis det, du søger, er en hurtig engangsløsning, så vil min tilgang fungere. Hvis du søger en langsigtet løsning, skal du enten dele dataene op i separate kolonner, acceptere den fjollede sorteringsrækkefølge eller tilføje en kolonne, der dikterer den relative sorteringsrækkefølge for hver værdi.