ヒントは次のとおりです。並べ替えで問題が発生した場合は、select句にアイテムごとの順序を追加してください。これにより、並べ替えているものが実際に並べ替えたいものであるかどうかを確認できます。
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
並べ替えが正しく行われた後、私がしなければならなかったのは、caseステートメントをorderby句に移動することだけです。
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条のため、数値の並べ替え式を数値型にキャストできませんでした。そのため、文字列の並べ替えが行われます。