sql >> Databasteknik >  >> RDS >> Sqlserver

Komplex sorts fältsträng - nummer - sträng

Denna lösning är mer tillförlitlig än det valda svaret. Det här svaret kanske inte ger det förväntade svaret om det finns mer än 1 nummer som "EPA WELL 5 7" på stationen. Den här lösningen fyller ut numret med "0" så att jämförelsen kommer att betrakta alla siffror med 8 siffror.

DECLARE  @Table1 table([station] varchar(26))

INSERT INTO @Table1
    ([station])
VALUES
    ('ANTIL WELL 2'),
    ('ANTIL WELL 1'),
    ('BASELINE & CALIFORNIA WELL'),
    ('EPA WELL 7'),
    ('EPA WELL 6'),
    ('EPA WELL 108'),
    ('EPA WELL 109'),
    ('EPA WELL 110'),
    ('EPA WELL 111'),
    ('EPA WELL 112'),
    ('EPA WELL 108S'),
    ('EPA WELL 111108')
;

SELECT station
FROM @table1
ORDER BY 
CASE WHEN station not like '%[0-9]%' THEN station ELSE
   STUFF(station, PATINDEX('%[0-9]%',station), 0, replicate('0', 
   PATINDEX('%[0-9]%',station) - len(station) + PATINDEX('%[0-9]%',reverse(station)) + 6))
END

*GoatCD:s svar ger inte rätt ordning i mina testdata.



  1. Kontrollera att PHP-datum- och tidsstämpeln är korrekt?

  2. Hur uppfyller jag enforce_srid_coordinate-begränsningen med GeoDjango/PostGIS?

  3. Vad händer om jag dödar en stor MySQL InnoDb DELETE-fråga?

  4. Sortera efter Soundex (eller liknande) `Närhet`