CASE 式に基づいてさまざまな基準で並べ替えたい select ステートメントがありますが、複数の基準で並べ替えたいときに構文に問題があります。次のコードのようにしたいのですが、構文エラーが発生します。
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
CASE 式に基づいてさまざまな基準で並べ替えたい select ステートメントがありますが、複数の基準で並べ替えたいときに構文に問題があります。次のコードのようにしたいのですが、構文エラーが発生します。
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
acase
は 1 つの値のみを返しますが、このケースを繰り返すことができます。
SELECT *
FROM Table1
ORDER BY (CASE WHEN @OrderBy = 1 THEN Column1
WHEN @OrderBy = 2 THEN Column3
end),
(CASE WHEN @OrderBy = 1 THEN Column2 END)
これにより、 の二次ソートが行わColumn2
れ@OrderBy = 1
ます。
実際、これも機能し、最初に考えていたものに近いかもしれません。
SELECT *
FROM Table1
ORDER BY (CASE WHEN @OrderBy = 1 THEN Column1 end),
(CASE WHEN @OrderBy = 1 THEN Column2 end),
(CASE WHEN @OrderBy = 2 THEN Column3 end)
このバージョンでは、最初の 2 つの句はNULL
値 2 のすべての行を返します。次に、3 番目の行がソートのために呼び出されます。
クライアントで ORDER BY CLAUSE を生成するか、DYNAMIC SQL を使用します
例えば:
DECLARE @sql VARCHAR(1000)
SET @sql = 'SELECT * FROM Table1 {order}';
SET @sql = CASE WHEN @orderBY = 1 THEN REPLACE(@sql, '{order}', 'ORDER BY column1, column2')
WHEN @orderBY = 2 THEN REPLACE(@sql, '{order}', 'ORDER BY column3')
END
-- by default value replace {order} to empty string
....
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1 else Column3 END,
Column2