ORDER BY在CASE表达式中有两个条件

时间:2013-07-29 23:59:58

标签: sql sql-server select sql-order-by switch-statement

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

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

4 个答案:

答案 0 :(得分: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订购也没关系

答案 1 :(得分:4)

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

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的{​​{1}}提供了二级排序。

事实上,这也会起作用,它可能更接近你最初的想法:

@OrderBy = 1

在此版本中,前两个子句将为值为2的所有行返回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 :(得分: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
  ....

答案 3 :(得分:0)

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