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

T-Sql - Bestil efter på alfanumerisk

Den nemmeste løsning er at forudsætte nuller

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

Dette vil dog ikke tage højde for alfategn. For at kunne håndtere alfategn, skal du vide, hvor mange potentielle alfategn du måtte have. Hvis der er en, kan du gøre noget som:

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

TILFØJELSE

Testkørsel:

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 note om min løsning. Hvis det er tilfældet, at det eller de alfabetiske tegn har en særlig betydning, bør du, som Erick Robertson foreslog, opdele dataene i separate kolonner. Ovenstående løsning vil kun håndtere to meget specifikke tilfælde:en helt numerisk værdi, en værdi med et enkelt efterfølgende alfabetisk tegn. Hvis dataene kan have flere alfabetiske tegn, eller hvis det alfabetiske tegn nogle gange er placeret anderledes end slutningen af ​​værdien, vil min løsning ikke fungere. Derudover skal det bemærkes, at min løsning vil forårsage en tabelscanning for at evaluere den ordre-bare streng på hver værdi.

Hvis det, du søger, er en hurtig engangsløsning, så vil min tilgang fungere. Hvis du søger en langsigtet løsning, skal du enten dele dataene op i separate kolonner, acceptere den fjollede sorteringsrækkefølge eller tilføje en kolonne, der dikterer den relative sorteringsrækkefølge for hver værdi.



  1. Brug af boolesk udtryk i rækkefølge efter klausul

  2. Sådan får du svarende til ResultSetMetaData uden ResultSet

  3. mysql ID automatisk stigning starter ikke fra 0

  4. Vil du slette en enkelt post fra Entity Framework?