Nejjednodušším řešením je vložit nuly
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
To však nebude zohledňovat alfa znaky. Abyste se mohli vypořádat s alfa postavami, musíte vědět, kolik potenciálních alfa postav můžete mít. Pokud existuje, můžete udělat něco jako:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
DOPLNĚNÍ
Zkušební provoz:
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
Poznámka k mému řešení. Pokud má abecední znak (znaky) zvláštní význam, měli byste, jak navrhl Erick Robertson, rozdělit data do samostatných sloupců. Výše uvedené řešení zvládne pouze dva velmi specifické případy:celočíselnou hodnotu, hodnotu s jedním koncovým abecedním znakem. Pokud data mohou mít více abecedních znaků nebo je abecední znak někdy umístěn jinde než na konci hodnoty, mé řešení nebude fungovat. Kromě toho je třeba poznamenat, že moje řešení způsobí skenování tabulky pro vyhodnocení řetězce, který lze objednat na každé hodnotě.
Pokud to, co hledáte, je jednorázové rychlé řešení, můj přístup bude fungovat. Pokud hledáte dlouhodobé řešení, pak buď rozdělte data do samostatných sloupců, přijměte praštěné pořadí řazení nebo přidejte sloupec, který určuje relativní pořadí řazení pro každou hodnotu.