De eenvoudigste oplossing is om nullen vooraf te laten gaan
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Dit houdt echter geen rekening met alfatekens. Om met alfatekens om te gaan, moet u weten hoeveel potentiële alfatekens u heeft. Als er een is, kun je zoiets doen als:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
AANVULLING
Proefdraaien:
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
Een opmerking over mijn oplossing. Als het het geval is dat het (de) alfabetische teken(s) een speciale betekenis heeft, moet u, zoals Erick Robertson suggereerde, de gegevens opsplitsen in afzonderlijke kolommen. De bovenstaande oplossing behandelt slechts twee zeer specifieke gevallen:een geheel numerieke waarde, een waarde met een enkel alfabetisch teken achteraan. Als de gegevens mogelijk meerdere alfabetische tekens bevatten of als het alfabetische teken soms op een andere plaats staat dan het einde van de waarde, zal mijn oplossing niet werken. Bovendien moet worden opgemerkt dat mijn oplossing een tabelscan zal veroorzaken om de bestelbare string op elke waarde te evalueren.
Als wat u zoekt een eenmalige snelle oplossing is, dan zal mijn aanpak werken. Als u op zoek bent naar een oplossing voor de lange termijn, verdeel dan de gegevens in afzonderlijke kolommen, accepteer de gekke sorteervolgorde of voeg een kolom toe die de relatieve sorteervolgorde voor elke waarde dicteert.