存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式

Posted

技术标签:

【中文标题】存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式【英文标题】:Stored procedure - A constant expression was encountered in the ORDER BY list, position 2 【发布时间】:2015-09-17 13:09:12 【问题描述】:

我在下面用 MSSQL 写了一个存储过程。它在 ORDER BY 子句中抛出错误。

a) 如果我在 ORDER BY 子句中只放置一个条件,它就可以正常工作。

b) 我不确定为什么它在执行过程时同时执行 ORDER BY 子句中的 CASE 语句的两个条件。理想情况下,如果满足第一个条件,它应该跳过第二个。

错误信息是:

错误:消息 408,级别 16,状态 1,行 3 在 ORDER BY 列表的位置 2 中遇到了一个常量表达式。

这是查询:

 SELECT *
 FROM tb_officemaster
 WHERE 1 = 1
     AND officecity LIKE '%gurgaon%'
     AND minprice > 100
     AND maxprice < 1000
 ORDER BY
     CASE WHEN 'priceasc'='priceasc' THEN "minprice" END ASC,
     CASE WHEN 'pricedesc'='priceasc' THEN minprice END DESC 

【问题讨论】:

【参考方案1】:

ORDER BY 子句中查看CASE 表达式,如下所示。这里的条件'priceasc'='priceasc' 是一个常量表达式,无论如何总是正确的,实际上并没有任何意义。它不会评估任何东西。 ORDER BY 必须以某种方式将给定的表达式评估为行的值并相应地排序。在您的情况下,THEN "minprice" 也是一个常数。

ORDER BY CASE WHEN 'priceasc'='priceasc' THEN "minprice"  END ASC

根据您发布的查询,order by 子句没有意义,您可以省略它。您的查询可以简单地是

select  * 
from tb_officemaster 
where 1=1 
and officecity like'%gurgaon%' 
and minprice >100 
and maxprice < 1000

根据您的评论,将您的 ORDER BY 更改为如下所示

ORDER BY CASE  WHEN pricedesc = priceasc THEN minprice END DESC

【讨论】:

感谢 Rahul,在上面的行中,我通过存储过程传递的参数不是恒定的。 ORDER BY CASE WHEN 'priceasc'='priceasc' THEN "minprice" END ASC ..这里 priceasc 是参数,表示第一个条件为真。这里发生的事情是我的第二个条件是也被处决了.. @KapilS,然后删除单引号。我相信这就是错误的根源。 我从下午开始就一直在努力解决这个问题,不管有没有引号都可以正常工作。问题是这部分代码有一些未知的问题集 @dynamicsql=@dynamicsql +' ORDER BY CASE WHEN '' priceasc''=' set @dynamicsql=@dynamicsql +''''+@orderbydetail +''' THEN "minprice" END (select null) ASC ,' set @dynamicsql=@dynamicsql +' CASE WHEN ''priceesc'' ='''+@orderbydetail+''' THEN minprice END (select null) DESC ' 再次为了满意,我删除了双引号和同样的问题。如果按子句集@dynamicsql=@dynamicsql +' ORDER BY 的顺序删除不匹配的条件,此代码将正常工作CASE WHEN ''priceasc''=' set @dynamicsql=@dynamicsql +''''+@orderbydetail +''' THEN minprice END ASC ,' set @dynamicsql=@dynamicsql +' CASE WHEN ''priceesc''=' ''+@orderbydetail+''' THEN minprice END DESC '

以上是关于存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式的主要内容,如果未能解决你的问题,请参考以下文章

如果语句包含 UNION、INTERSECT 或 EXCEPT 运算符,则 ORDER BY 项必须出现在选择列表中

SQL 分页查询存储过程中order by 后面不能传变量的问题怎么解决

无法将 ORDER BY 命令添加到存储过程

MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY

在 MySQL 中使用 Case 加入 Group By & Order

从存储过程中的视图中选择时不能使用 ORDER BY