Den enklaste lösningen är att prependera nollor
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Detta kommer dock inte att ta hänsyn till alfatecken. För att kunna hantera alfatecken måste du veta hur många potentiella alfatecken du kan ha. Om det finns en, kan du göra något som:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
TILLÄGG
Testkörning:
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 anteckning om min lösning. Om det är så att det eller de alfabetiska tecknen har speciell betydelse, bör du, som Erick Robertson föreslog, dela upp data i separata kolumner. Ovanstående lösning kommer bara att hantera två mycket specifika fall:ett helt numeriskt värde, ett värde med ett enda alfabetiskt tecken. Om data kan ha flera alfabetiska tecken eller om det alfabetiska tecknet ibland är placerat på ett annat sätt än slutet av värdet, kommer min lösning inte att fungera. Dessutom bör det noteras att min lösning kommer att orsaka en tabellskanning för att utvärdera den beställningsbara strängen på varje värde.
Om det du söker är en snabb engångslösning, så kommer mitt tillvägagångssätt att fungera. Om du söker en långsiktig lösning, kan du antingen dela upp data i separata kolumner, acceptera den fåniga sorteringsordningen eller lägga till en kolumn som anger den relativa sorteringsordningen för varje värde.