2

我有一个 select 语句,我想根据 CASE 表达式按不同的条件进行排序,但是当我想按多个条件进行排序时,我遇到了语法问题。我希望它类似于以下代码,但我得到语法错误。

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

4 回答 4

4

CASE是一个只返回一个结果的表达式,不能像其他一些语言那样用于流控制逻辑我不知道你的数据类型是什么所以我猜你想要这个:

CASE WHEN @OrderBy = 1 THEN Column1 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
Column2;

如果 Column1 和 Column3 具有相同(或兼容)的数据类型,则可以简化:

CASE @OrderBy 
  WHEN 1 THEN Column1
  WHEN 2 THEN Column3 END,
Column2;

您可以将 Column2 添加到末尾,因为它不需要条件 - 它是第一个条件的第二个,如果您只关心第二个条件的 Column3,那么您也可以按 Column2 排序。

于 2013-07-30T00:06:48.453 回答
4

虽然 acase只返回一个值,但您可以重复这种情况:

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这给出了对for的二次排序@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)

在这个版本中,前两个子句将返回NULL值为 2 的所有行。然后将调用第三行进行排序。

于 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 回答