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

相关推荐
Porunarufu1 小时前
博客系统UI自动化测试报告
java
pele1 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python
HHHHH1010HHHHH1 小时前
Redis怎样判断节点是否主观下线_哨兵基于down-after-milliseconds参数的心跳超时判定
jvm·数据库·python
Yushan Bai1 小时前
通过oracle 自动优化任务dbms_sqltune进行SQL优化的实战
数据库·oracle
qq_654366982 小时前
CSS如何处理@import样式表的嵌套加载_评估递归对加载的影响
jvm·数据库·python
weixin_381288182 小时前
苹果微软双修党福音:Navicat如何跨系统平滑迁移配置
jvm·数据库·python
NineData2 小时前
NineData将亮相DACon 2026上海站!解锁AGI时代数据“智理”新范式
数据库·后端·架构
川石课堂软件测试2 小时前
软件测试:典型面试题库
数据库·python·功能测试·mysql·单元测试·grafana·prometheus
of Watermelon League2 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
Aurorar0rua2 小时前
CS50 x 2024 Notes C - 05
java·c语言·数据结构