使用CASE WHEN的ORDER BY子句出错

时间:2016-11-16 13:20:00

标签: sql-server-2016

我正在尝试允许ASC / DESC排序顺序由存储过程中的参数定义。

经过大量研究,我发现了这种方法(简化):

SELECT *
FROM MyTable
ORDER BY CASE WHEN @reverse = 1 THEN
              MyColumn
         END DESC,
         CASE WHEN @reverse = 0 THEN
              MyColumn
         END ASC

但是,此代码会引发以下错误:

  

Msg 408,Level 16,State 1,Line 8
  在ORDER BY列表中遇到了一个常量表达式,位置为2。

为什么会这样?显然,MyColumn不是常量 - 它是列名。

在兼容模式2016(130)中使用SQL Server 2016

由于

2 个答案:

答案 0 :(得分:1)

some search this line helped me了解更多信息之后......

  

按表达式排序必须求值为常量

正如Lamak指出的那样,1=0的计算结果为false,而你没有定义一个else条件。所以null是未定义的,它会抛出错误

摆脱下面的尝试

ORDER BY CASE WHEN 1 = 1 THEN
              MyColumn
         END DESC,
         CASE WHEN 1 = 0 THEN
              col2 else col2--not your column,added this to make example clearer
         END ASC

还要注意,按顺序排列的表达式必须是唯一的,因此你的查询将无效(即使它成功)并抛出不同的错误,你也可以使用ISNULL

答案 1 :(得分:0)

所有这些悲伤的真正根本原因是:

ASC

需要

SELECT, FROM

是一个硬编码字符串(如{{1}}等),不能是字符串变量。 ; - ((

为了克服这个限制, 和试图使用CASE克服它的问题, 我已经将95%的查询填充为表变量, 然后我有两个查询之一,使用正确的ORDER BY子句从中选择SELECT。