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.