Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-Sql - Trier par sur Alphanumérique

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.