我有一个 select 语句,我想根据 CASE 表达式按不同的条件进行排序,但是当我想按多个条件进行排序时,我遇到了语法问题。我希望它类似于以下代码,但我得到语法错误。
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
我有一个 select 语句,我想根据 CASE 表达式按不同的条件进行排序,但是当我想按多个条件进行排序时,我遇到了语法问题。我希望它类似于以下代码,但我得到语法错误。
SELECT *
FROM Table1
ORDER BY
CASE WHEN @OrderBy = 1 THEN Column1, Column2 END,
CASE WHEN @OrderBy = 2 THEN Column3 END,
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 排序。
虽然 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 的所有行。然后将调用第三行进行排序。
在客户端生成 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