我有一个select语句,我想根据CASE表达式按不同的标准排序,但是当我想按多个条件排序时,我遇到语法问题。我希望它类似于以下代码,但我得到语法错误。
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
答案 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