我遇到以下问题。 我想执行sql语句,用HAVING过滤结果。但是,has是在一个列中,该列是从select中的IF()函数计算出来的。这样,MySQL服务器就会抱怨having子句中的列是未知的!
EX:
SELECT col1,col2,IF(expr1,expr2,expr3) AS `wantedColumn`
FROM....
WHERE ...
HAVING LENGTH(`wantedColumn)>0
正如mysql无法理解if表达式返回的列名为wantedColumn ...如果我使用其他列它正常工作。但我需要对此进行过滤。有什么建议? 感谢
答案 0 :(得分:2)
这是由模式配置引起的:
如果您的数据库使用模式' ONLY_FULL_GROUP_BY',您将无法在WHERE,GROUP BY或HAVING中使用列别名,它不起作用。您必须重复整个表达式或使用子查询。
为了知道您是否正在使用' ONLY_FULL GROUP_BY'模式,使用以下查询:
SELECT @@sql_mode;
如果您想将其更改为允许它的模式:
SET SESSION sql_mode =STRICT_TRANS_TABLES;
要了解有关SQL模式的更多信息: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
答案 1 :(得分:0)
回答Inanda Menezes的评论@Inanda:
看看它:sqlfiddle.com/#!2/5294e4/6,我刚刚删除了反引号 来自has中使用的别名和你的例子工作。 根据mysql文档,您不需要使用反引号 没有特殊字词或字符的标识符。如果你使用 它,在大多数情况下,它不会导致您的查询失败,但它是 没有必要引用非标准的普通标识符 逃逸。无论如何,当用后挡板逃避别名时似乎失败了 在having子句中使用长度函数,所以不要逃避这个 一。 - Inanda Menezes