Oto wskazówka:za każdym razem, gdy masz problemy z sortowaniem, dodaj kolejność według elementów do klauzuli select. pozwoli Ci to sprawdzić, czy to, według czego sortujesz, jest rzeczywiście tym, według którego chcesz sortować:
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
Po prawidłowym sortowaniu wystarczyło przenieść instrukcje przypadku do klauzuli kolejności według:
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
Zasadniczo miałeś 4 główne problemy:
- Twoje alfabetyczne wyrażenie sortowania zakładało, że każdy wiersz zawiera liczby.
- Twoje alfabetyczne wyrażenie sortowania zawierało zarówno liczby, jak i tekst.
- Twoje wyrażenie sortowania liczbowego zawierało zarówno wartości liczbowe, jak i alfabetyczne.
- Ze względu na artykuł 3 nie można było rzutować wyrażenia sortowania liczbowego na typ liczbowy i dlatego można uzyskać sortowanie ciągów.