为什么使用CASE表达式不适用于GROUP BY和HAVING子句?

时间:2017-01-17 09:22:19

标签: mysql sql

以下示例只是一个测试,但我想可以构建一些实际上有意义的东西。无论如何,我不明白为什么它不起作用。 MySQL在'having clause'中报告 [42S22] [1054]未知列'document0_.age'。我用许多其他数据库(PostgreSQL,DB2,Oracle,SQL Server等)测试了相同的查询,MySQL是唯一抱怨这个。

有人可以向我解释为什么这不起作用?我知道我可以将age列放入GROUP BY子句并完成它,但这是生成的代码,我需要添加一个处理这个MySQL问题的特殊情况,这就是为什么我想更好了解这个问题。这只是CASE WHEN语句的问题,还是其他表达式(例如嵌套函数调用)也可能导致这样的错误?

select count(versions1_.id) as col_0_0_
from Document document0_
  left outer join document_version versions1_ on document0_.id=versions1_.document_id
group by
  document0_.id,
  case when document0_.id=document0_.age and document0_.age<4 then '2' when document0_.id=4 then '4' else '3' end
having
  case when document0_.id=document0_.age and document0_.age<4 then '2' when document0_.id=4 then '4' else '3' end='2'

编辑:我刚试过函数调用是否也有问题,实际上它们确实存在问题。以下错误消息也会失败。

select count(versions1_.id) as col_0_0_
from Document document0_
  left outer join document_version versions1_ on document0_.id=versions1_.document_id
group by
  document0_.id,
  POW(document0_.id,document0_.age)
having
  POW(document0_.id,document0_.age)=2

我开始相信MySQL没有检测到表达式是相等的,因此在执行HAVING子句部分时会尝试重新计算它们。我是对的吗?

1 个答案:

答案 0 :(得分:0)

SUM子句中添加HAVING后,它正在运行,如下所示:

HAVING SUM(case when document0_.id=document0_.age and document0_.age<4
                     then '2' 
                when document0_.id=4 then '4' else '3' 
            end)='2' 

请尝试一下,如果有效的话。我已经用类似的情况检查了它,它也适用于你的情况。

请点击此链接获取详细信息Unknown column in 'having clause'