Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

T-Sql - Ordina per su alfanumerico

La soluzione più semplice è anteporre gli zeri

Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)

Tuttavia, questo non terrà conto dei caratteri alfa. Per gestire i personaggi alfa, dovresti sapere quanti potenziali personaggi alfa potresti avere. Se ce n'è uno, potresti fare qualcosa del tipo:

Select ...
From #Test
Order By Case
    When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
    Else Right('0000000000' + NumVal, 10)
    End

AGGIUNTA

Prova:

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

Una nota sulla mia soluzione. Se è il caso che i caratteri alfabetici abbiano un significato speciale, come suggerito da Erick Robertson, dovresti suddividere i dati in colonne separate. La soluzione precedente gestirà solo due casi molto specifici:un valore tutto numerico, un valore con un singolo carattere alfabetico finale. Se i dati potrebbero avere più caratteri alfabetici o il carattere alfabetico a volte è posizionato in modo diverso dalla fine del valore, la mia soluzione non funzionerà. Inoltre, va notato che la mia soluzione causerà una scansione della tabella per valutare la stringa ordinabile su ciascun valore.

Se quello che cerchi è una soluzione rapida una tantum, allora il mio approccio funzionerà. Se stai cercando una soluzione a lungo termine, suddividi i dati in colonne separate, accetta l'ordinamento sciocco o aggiungi una colonna che determina l'ordinamento relativo per ciascun valore.