Ecco un suggerimento:ogni volta che hai problemi con l'ordinamento, aggiungi l'ordine per articoli alla tua clausola select. questo ti consentirà di vedere se ciò che stai ordinando è effettivamente ciò che desideri ordinare:
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
Dopo aver ottenuto l'ordinamento correttamente, tutto ciò che dovevo fare è spostare le istruzioni del caso nell'ordine per clausola:
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
Fondamentalmente, hai avuto 4 problemi principali:
- La tua espressione di ordinamento alfabetico presuppone che ogni riga contenga numeri.
- La tua espressione di ordinamento alfabetico conteneva sia i numeri che il testo.
- La tua espressione di ordinamento numerico aveva valori sia numerici che alfabetici.
- A causa dell'articolo 3, non è possibile eseguire il cast dell'espressione di ordinamento numerico in un tipo numerico, ed è per questo che si dovrebbe ottenere un ordinamento di stringhe.