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.