Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Tri alphanumérique

Voici un conseil :chaque fois que vous rencontrez des problèmes avec le tri, ajoutez l'ordre des éléments à votre clause de sélection. cela vous permettra de voir si ce que vous triez est réellement ce que vous voulez trier :

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

Une fois que j'ai trié correctement, tout ce que j'avais à faire est de déplacer les instructions de cas dans l'ordre par clause :

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

En gros, vous aviez 4 problèmes majeurs :

  • Votre expression de tri alphabétique suppose que chaque ligne contient des nombres.
  • Votre expression de tri alphabétique contenait les chiffres ainsi que le texte.
  • Votre expression de tri numérique comportait à la fois des valeurs numériques et alphabétiques.
  • En raison de l'article 3, vous ne pouviez pas convertir votre expression de tri numérique en un type numérique, et c'est pourquoi vous obtiendriez un tri de chaîne.

Voir ce violon sql