sql报错:java.sql.SQLSyntaxErrorException: Unknown column 'as0' in 'where clause'
原因
- sql语句在编写时,直接在where中使用了别名
- 数据库在解析时,WHERE 子句的执行优先级高于 SELECT 子句,此时还不认识as0这个别名,所以会报 "Unknown column 'as0'"
- 在 MySQL 中,通常情况下 WHERE 子句中是不能直接使用列别名的,因为 SQL 的执行顺序是先解析 WHERE 条件,再执行 SELECT 部分(包括别名定义)
- 有时候使用别名但是不会报错,这是特殊结构,如:别名定义在外层子查询,使用在更外层的 WHERE 中
sql
WHERE
<if test="onlineState != null and onlineState != 0"> and as0 < 0 </if>
GROUP BY account
解决
- 使用原始表达式代替别名
sql
-- 别名
SELECT
d.ip,
d.mac,
d.login_time,d.`status`,
sum(case when `status`=1 and is_app_device=1 then 1 else 0 end) as0,
-- 使用原始表达式代替别名
<if test="onlineState != null and onlineState != 0">
and sum(CASE WHEN `status` = 1 AND is_app_device = 1 THEN 1 ELSE 0 END) < 0
</if>
- 使用 HAVING 子句代替 WHERE 子句(推荐,更清晰):
sql
<where>
-- 条件
</where>
GROUP BY account
<if test="onlineState != null">
HAVING
<if test="onlineState != 0">
as0 < 0
</if>
</if>
注意:HAVING 子句必须放在 GROUP BY 之后,它可以正常使用 SELECT 中定义的别名,专门用于过滤分组后的结果。