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

相关推荐
Coder_Boy_32 分钟前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy39 分钟前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
invicinble1 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟1 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖1 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
数据知道2 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707532 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha2 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.3 小时前
Day06——权限认证-项目集成
java