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

Alfanumerisk sortering

Her er et tip:Når du har problemer med sorteringen, skal du tilføje rækkefølge efter varer til din udvalgte klausul. dette vil gøre dig i stand til at se, om det, du sorterer efter, faktisk er det, du vil sortere efter:

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

Efter at jeg har fået sorteringen korrekt, skal jeg bare flytte sagsudtalelserne til orden efter klausul:

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

Grundlæggende havde du 4 store problemer:

  • Dit alfabetiske sorteringsudtryk antog, at hver række har tal i sig.
  • Dit alfabetiske sorteringsudtryk indeholdt tallene såvel som teksten.
  • Dit numeriske sorteringsudtryk havde både numeriske og alfabetiske værdier.
  • På grund af artikel 3 kunne du ikke caste dit numeriske sorteringsudtryk til en numerisk type, og det er derfor, du ville få dig en strengsortering.

Se denne sql violin



  1. Gendannelse af MySQl-database fra .frm, ibdata og ib_logfile

  2. liste over tabeller uden indeks i sql 2008

  3. Sådan åbnes en database i eksklusiv tilstand i Access 2016

  4. Laravel 5.3 Oprettelse af modeller Returnerer Feltet har ikke en standardværdi