Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-Sql - Sortieren nach auf alphanumerisch

Die einfachste Lösung ist, Nullen voranzustellen

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

Dies berücksichtigt jedoch keine Alphazeichen. Um mit Alphazeichen umgehen zu können, müssten Sie wissen, wie viele potenzielle Alphazeichen Sie möglicherweise haben. Wenn es einen gibt, könnten Sie so etwas tun:

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

ZUSATZ

Testlauf:

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

Eine Anmerkung zu meiner Lösung. Wenn es der Fall ist, dass das/die alphabetische(n) Zeichen eine besondere Bedeutung hat/haben, dann sollten Sie, wie Erick Robertson vorgeschlagen hat, die Daten in separate Spalten aufteilen. Die obige Lösung behandelt nur zwei sehr spezifische Fälle:einen rein numerischen Wert, einen Wert mit einem einzelnen nachgestellten alphabetischen Zeichen. Wenn die Daten möglicherweise mehrere alphabetische Zeichen enthalten oder das alphabetische Zeichen manchmal an einer anderen Stelle als am Ende des Werts positioniert ist, funktioniert meine Lösung nicht. Darüber hinaus sollte beachtet werden, dass meine Lösung einen Tabellenscan veranlasst, um die bestellbare Zeichenfolge für jeden Wert auszuwerten.

Wenn Sie eine einmalige schnelle Lösung suchen, dann wird mein Ansatz funktionieren. Wenn Sie nach einer langfristigen Lösung suchen, teilen Sie die Daten entweder in separate Spalten auf, akzeptieren Sie die doofe Sortierreihenfolge oder fügen Sie eine Spalte hinzu, die die relative Sortierreihenfolge für jeden Wert vorgibt.