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

相关推荐
SeaDhdhdhdhdh15 小时前
MCP Server 搭建与使用指南
java·ai·agent·mcp
YH552698416 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
智购科技智能售货柜16 小时前
2026自动售货机整机可靠性测试:从高低温交变到EMC电磁兼容的认证工程实践~YH
运维·服务器·数据库·人工智能·物联网
ltl16 小时前
RocksDB 架构演进:相对 LevelDB 的 diff 地图
数据库
ltl16 小时前
存储读取性能优化:索引、Bloom Filter 与读放大
数据库
AI_小站16 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
许彰午17 小时前
03-三种开发模式
java·架构
涟漪海洋17 小时前
创建最新的JDK25镜像,非root环境启动
java
Rain的Java大神之路18 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
2602_9599609218 小时前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题