Ето един съвет:Винаги, когато имате проблеми със сортирането, добавете ред по елементи към вашата клауза за избор. това ще ви позволи да видите дали това, по което сортирате, всъщност е това, по което искате да сортирате:
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
След като направих сортирането правилно, всичко, което трябваше да направя, е да преместя операторите за случай в клаузата за реда по:
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
По принцип сте имали 4 основни проблема:
- Вашият израз за сортиране по азбучен ред предполага, че всеки ред има числа в него.
- Вашият израз за сортиране по азбучен ред съдържаше числата, както и текста.
- Вашият числов израз за сортиране имаше както числови, така и азбучни стойности.
- Поради член 3 не можете да прехвърлите своя израз за числово сортиране към числов тип и това е причината да получите сортиране по низ.