列别名不适用于Group,Where和MySQL

时间:2015-01-22 19:58:53

标签: mysql sql if-statement having

我遇到以下问题。 我想执行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 ...如果我使用其他列它正常工作。但我需要对此进行过滤。有什么建议? 感谢

2 个答案:

答案 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