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 中定义的别名,专门用于过滤分组后的结果。

相关推荐
程序员三明治14 小时前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
Cosmoshhhyyy17 小时前
《Effective Java》解读第5条:优先考虑依赖注入来引用资源
java
.柒宇.19 小时前
力扣hot100----15.三数之和(java版)
java·数据结构·算法·leetcode
xrkhy19 小时前
微服务之ShardingSphere
数据库·微服务·oracle
程序员卷卷狗19 小时前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
cj63411815019 小时前
【MySQL】mysqldump使用方法
java·后端
JIngJaneIL19 小时前
停车场管理|停车预约管理|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·停车场管理系统
煎蛋学姐19 小时前
SSM儿童福利院管理系统ys9w2d07(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架·儿童福利院管理系统
sg_knight20 小时前
MySQL 空间索引(SPATIAL)详解:地理位置数据的高效查询利器
数据库·mysql·database·索引·关系型数据库·空间索引·spatial
杰克尼20 小时前
二分查找为什么总是写错
java·数据结构·算法