2

CASE 式に基づいてさまざまな基準で並べ替えたい select ステートメントがありますが、複数の基準で並べ替えたいときに構文に問題があります。次のコードのようにしたいのですが、構文エラーが発生します。

SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
4

4 に答える 4

4

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 番目の行がソートのために呼び出されます。

于 2013-07-30T00:30:26.597 に答える
2

クライアントで 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
  ....
于 2013-07-30T00:31:54.513 に答える
0
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1 else Column3 END,
Column2
于 2013-07-30T00:08:38.363 に答える