Her er et tip:Når du har problemer med sorteringen, skal du tilføje rækkefølge efter varer til din udvalgte klausul. dette vil gøre dig i stand til at se, om det, du sorterer efter, faktisk er det, du vil sortere 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 at jeg har fået sorteringen korrekt, skal jeg bare flytte sagsudtalelserne til orden efter klausul:
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
Grundlæggende havde du 4 store problemer:
- Dit alfabetiske sorteringsudtryk antog, at hver række har tal i sig.
- Dit alfabetiske sorteringsudtryk indeholdt tallene såvel som teksten.
- Dit numeriske sorteringsudtryk havde både numeriske og alfabetiske værdier.
- På grund af artikel 3 kunne du ikke caste dit numeriske sorteringsudtryk til en numerisk type, og det er derfor, du ville få dig en strengsortering.