La solution la plus simple consiste à ajouter des zéros avant
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
Cependant, cela ne tiendra pas compte des caractères alpha. Afin de gérer les caractères alpha, vous devez savoir combien de caractères alpha potentiels vous pourriez avoir. S'il y en a un, vous pouvez faire quelque chose comme :
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
AJOUT
Essai :
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
Une note sur ma solution. S'il est vrai que le ou les caractères alphabétiques ont une signification particulière, alors, comme l'a suggéré Erick Robertson, vous devez diviser les données en colonnes séparées. La solution ci-dessus ne traitera que deux cas très spécifiques :une valeur entièrement numérique, une valeur avec un seul caractère alphabétique de fin. Si les données peuvent avoir plusieurs caractères alphabétiques ou si le caractère alphabétique est parfois positionné autre que la fin de la valeur, ma solution ne fonctionnera pas. De plus, il convient de noter que ma solution entraînera une analyse de table pour évaluer la chaîne de commande sur chaque valeur.
Si ce que vous recherchez est une solution rapide et ponctuelle, mon approche fonctionnera. Si vous recherchez une solution à long terme, divisez les données en colonnes séparées, acceptez l'ordre de tri loufoque ou ajoutez une colonne qui dicte l'ordre de tri relatif pour chaque valeur.