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

Alphanumerische Sortierung

Hier ist ein Tipp:Wann immer Sie Probleme mit der Sortierung haben, fügen Sie order by items zu Ihrer select-Klausel hinzu. Dadurch können Sie sehen, ob das, wonach Sie sortieren, tatsächlich das ist, wonach Sie sortieren möchten:

SELECT Section,
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
        ELSE 
          Section
        END As alphabetical_sort, -- alphabetical sort
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
        ELSE
          NULL
        END As Numeric_Sort
FROM dbo.Section
ORDER BY alphabetical_sort, Numeric_Sort

Nachdem ich die Sortierung richtig hinbekommen habe, musste ich nur noch die case-Anweisungen in die order by-Klausel verschieben:

SELECT Section
FROM dbo.Section
ORDER BY 
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
    ELSE 
        Section
    END , -- Alphabetical sort
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
    ELSE
        NULL
    END  -- Numeric sort

Grundsätzlich hatten Sie 4 Hauptprobleme:

  • Ihr alphabetischer Sortierausdruck ging davon aus, dass jede Zeile Zahlen enthält.
  • Ihr alphabetischer Sortierausdruck enthielt sowohl die Zahlen als auch den Text.
  • Ihr numerischer Sortierausdruck hatte sowohl numerische als auch alphabetische Werte.
  • Aufgrund von Artikel 3 konnten Sie Ihren numerischen Sortierausdruck nicht in einen numerischen Typ umwandeln, weshalb Sie eine Zeichenfolgensortierung erhalten würden.

Siehe diese SQL-Geige