sql >> Database >  >> RDS >> Sqlserver

T-Sql - Bestel op alfanumeriek

De eenvoudigste oplossing is om nullen vooraf te laten gaan

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

Dit houdt echter geen rekening met alfatekens. Om met alfatekens om te gaan, moet u weten hoeveel potentiële alfatekens u heeft. Als er een is, kun je zoiets doen als:

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

AANVULLING

Proefdraaien:

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

Een opmerking over mijn oplossing. Als het het geval is dat het (de) alfabetische teken(s) een speciale betekenis heeft, moet u, zoals Erick Robertson suggereerde, de gegevens opsplitsen in afzonderlijke kolommen. De bovenstaande oplossing behandelt slechts twee zeer specifieke gevallen:een geheel numerieke waarde, een waarde met een enkel alfabetisch teken achteraan. Als de gegevens mogelijk meerdere alfabetische tekens bevatten of als het alfabetische teken soms op een andere plaats staat dan het einde van de waarde, zal mijn oplossing niet werken. Bovendien moet worden opgemerkt dat mijn oplossing een tabelscan zal veroorzaken om de bestelbare string op elke waarde te evalueren.

Als wat u zoekt een eenmalige snelle oplossing is, dan zal mijn aanpak werken. Als u op zoek bent naar een oplossing voor de lange termijn, verdeel dan de gegevens in afzonderlijke kolommen, accepteer de gekke sorteervolgorde of voeg een kolom toe die de relatieve sorteervolgorde voor elke waarde dicteert.



  1. Heeft iemand ontdekt dat REGEX \b niet werkt in MYSQL?

  2. MySQLdb installeren op Snow Leopard

  3. dBase-ondersteuning is terug in Microsoft Access!

  4. MySQL Hoe een nieuw record invoegen of een veld bijwerken, afhankelijk van of het bestaat?