sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘

sql报错:java.sql.SQLSyntaxErrorException: Unknown column 'as0' in 'where clause'

原因

  1. sql语句在编写时,直接在where中使用了别名
  2. 数据库在解析时,WHERE 子句的执行优先级高于 SELECT 子句,此时还不认识as0这个别名,所以会报 "Unknown column 'as0'"
  3. 在 MySQL 中,通常情况下 WHERE 子句中是不能直接使用列别名的,因为 SQL 的执行顺序是先解析 WHERE 条件,再执行 SELECT 部分(包括别名定义)
  4. 有时候使用别名但是不会报错,这是特殊结构,如:别名定义在外层子查询,使用在更外层的 WHERE 中
sql 复制代码
WHERE 
     <if test="onlineState != null and onlineState != 0"> and as0 &lt; 0 </if>
GROUP BY account

解决

  1. 使用原始表达式代替别名
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) &lt; 0
</if>
  1. 使用 HAVING 子句代替 WHERE 子句(推荐,更清晰):
sql 复制代码
<where> 
-- 条件
</where>
GROUP BY account
<if test="onlineState != null">
    HAVING 
    <if test="onlineState != 0">
        as0 &lt; 0
    </if>
</if>

注意:HAVING 子句必须放在 GROUP BY 之后,它可以正常使用 SELECT 中定义的别名,专门用于过滤分组后的结果。

相关推荐
legendary_bruce2 分钟前
RAG知识库进阶-1
java·aigc
必须会一定会3 分钟前
大模型手搓文件对比工具(6):差异不用再手选
java·人工智能·ai编程
yio_yin13 分钟前
MyBatis
java·前端·mybatis
jnrjian13 分钟前
psql 执行多个 sql 文件
数据库·sql
程序员-Benothing18 分钟前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
上海安当技术1 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
mifengxing1 小时前
Java集合与泛型
java·算法·复习笔记
不才不才不不才1 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
流云鹤1 小时前
05Java学习day(5)
java·学习
用户3126874877202 小时前
Spring 事件机制到底怎么传播的?ApplicationEvent 源码拆解
java·spring