sql >> Databasteknik >  >> RDS >> Sqlserver

T-Sql - Beställ efter på alfanumeriskt

Den enklaste lösningen är att prependera nollor

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

Detta kommer dock inte att ta hänsyn till alfatecken. För att kunna hantera alfatecken måste du veta hur många potentiella alfatecken du kan ha. Om det finns en, kan du göra något som:

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

TILLÄGG

Testkörning:

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

En anteckning om min lösning. Om det är så att det eller de alfabetiska tecknen har speciell betydelse, bör du, som Erick Robertson föreslog, dela upp data i separata kolumner. Ovanstående lösning kommer bara att hantera två mycket specifika fall:ett helt numeriskt värde, ett värde med ett enda alfabetiskt tecken. Om data kan ha flera alfabetiska tecken eller om det alfabetiska tecknet ibland är placerat på ett annat sätt än slutet av värdet, kommer min lösning inte att fungera. Dessutom bör det noteras att min lösning kommer att orsaka en tabellskanning för att utvärdera den beställningsbara strängen på varje värde.

Om det du söker är en snabb engångslösning, så kommer mitt tillvägagångssätt att fungera. Om du söker en långsiktig lösning, kan du antingen dela upp data i separata kolumner, acceptera den fåniga sorteringsordningen eller lägga till en kolumn som anger den relativa sorteringsordningen för varje värde.



  1. Spool-kommando:Mata inte ut SQL-satsen till filen

  2. slå samman två SELECT-frågor

  3. Variabler i lagrad procedur MySQL

  4. kontrollera om frågan resulterar i tom rad mysqli