sql >> Databasteknik >  >> RDS >> Sqlserver

Alfanumerisk sortering

Här är ett tips:Närhelst du har problem med sorteringen, lägg till ordning efter artiklar i din valklausul. detta gör att du kan se om det du sorterar efter faktiskt är det du vill sortera 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 att jag har fått sorteringen korrekt, allt jag behövde göra är att flytta fallsatserna till ordningsföljd:

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

I grund och botten hade du fyra stora problem:

  • Ditt alfabetiska sorteringsuttryck antog att varje rad har siffror.
  • Ditt alfabetiska sorteringsuttryck innehöll både siffrorna och texten.
  • Ditt numeriska sorteringsuttryck hade både numeriska och alfabetiska värden.
  • På grund av artikel 3 kunde du inte använda ditt numeriska sorteringsuttryck till en numerisk typ, och det är därför du skulle få en strängsortering.

Se denna sql-fiol



  1. Objekt kan inte konverteras till en sträng i MySQLi PHP

  2. Vad är en bra databasdesign (schema) för en närvarodatabas?

  3. Parsar extremt stora XML-filer i php

  4. PHP/PDO:Förberedda uttalanden fungerar inte när man skapar en tabell?