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.