sql >> Database >  >> RDS >> Sqlserver

Alfanumeriek sorteren

Hier is een tip:als je problemen hebt met sorteren, voeg dan de volgorde van items toe aan je selectieclausule. dit stelt u in staat om te zien of datgene waarop u sorteert ook daadwerkelijk is waarop u wilt sorteren:

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

Nadat ik de sortering correct heb, hoef ik alleen maar de case-statements naar de order by-clausule te verplaatsen:

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

Kortom, u had 4 grote problemen:

  • Uw alfabetische sorteeruitdrukking ging ervan uit dat elke rij getallen bevat.
  • Uw alfabetische sorteeruitdrukking bevatte zowel de cijfers als de tekst.
  • Uw numerieke sorteeruitdrukking had zowel numerieke als alfabetische waarden.
  • Vanwege artikel 3 kon je je numerieke sorteerexpressie niet casten naar een numeriek type, en daarom zou je een stringsortering krijgen.

Bekijk deze sql-viool



  1. Docker Compose + Spring Boot + Postgres-verbinding

  2. Oracle sql-zelfstudie:Basis SQL-instructie

  3. MySql Algemene fout:2053

  4. Selecteer rijen met maximale kolomwaarde groep op een andere kolom