Zde je tip:Kdykoli máte problémy s řazením, přidejte do vybrané klauzule pořadí podle položek. to vám umožní zjistit, zda to, podle čeho třídíte, je skutečně to, podle čeho chcete třídit:
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
Poté, co jsem seřadil správně, vše, co jsem musel udělat, je přesunout případová prohlášení do pořadí podle klauzule:
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
V podstatě jste měli 4 hlavní problémy:
- Váš výraz řazení podle abecedy předpokládá, že každý řádek obsahuje čísla.
- Váš výraz pro řazení podle abecedy obsahoval čísla i text.
- Váš číselný výraz řazení měl číselné i abecední hodnoty.
- Vzhledem k článku 3 jste nemohli přetypovat svůj číselný výraz řazení na číselný typ, a proto byste získali řazení podle řetězce.