MySQL:IFNULL无法返回null的情况

标签:Mysql, 数据库

为什么当exp为"空"时,IFNULL(exp,null)无法返回null。

前情提要
什么情景下会发生该问题

比如我们要找出一个表中只出现过一次的最大数字。如果没找到则返回NULL(Leetcode题目)。 又或者是找出某个不等于特定值的数,这个时候用IFNULL,很合理也很容易想到。

比如我们要找出不等于0的数,如果没找到就返回NULL。

复制代码
SELECT IFNULL(num,null) AS num
FROM MyNumbers
WHERE num!=0

However,这条SQL没用。你会发现返回的是空值,而不是null。这里为了方便直接复制leetcode的输出

复制代码
输入
MyNumbers =
| num | 
| --- | 
| 0 |

输出
| num |
| --- |

为啥呢?如果表中的所有数都等于0,那么按照SQL语句的执行顺序,FROM->WHERE->SELECT,在WHERE筛选后num不就为null了吗?为什么IFNULL无法返回后值null呢?

为啥在WHERE之后就不生效了?先思考一下,WHERE筛选之后的结果集是NULL吗?

如是。它真的是NULL吗?如是。WHERE筛选后确实没有匹配的记录,那它的结果集里面会有NULL吗?很明显不会,单纯就是啥都没有,即emptyset,空值的集合。

而IFNULL是干什么的?对于IFNULL(exp,value)来说,当exp的结果为NULL,才会返回value。而不是当exp的结果为空值(N/A)时,返回value。

要解决这个问题也很简单,加个聚合函数完事。最直接的就是加个MAX,MAX对emptyset计算,发现找不到任何一条记录,诶,那它就返回个NULL,完事。

复制代码
SELECT IFNULL(MAX(num),null)AS num
FROM MyNumbers
WHERE num!=0
相关推荐
聆风吟º8 小时前
Oracle到KingbaseES数据库迁移:全流程实战指南与避坑总结
数据库·oracle·数据库迁移·kingbasees
哈__8 小时前
Oracle至KingbaseES数据库迁移全攻略:痛点拆解、配置实操与问题排查
数据库·oracle
JZC_xiaozhong9 小时前
电商ERP如何同步订单数据到MySQL?集成方案解析
数据库·mysql·数据分析·etl工程师·嵌入式实时数据库·电商erp集成·数据集成与应用集成
消失的旧时光-19439 小时前
第四篇(实战): 订单表索引设计实战:从慢 SQL 到毫秒级
java·数据库·sql
知识分享小能手9 小时前
Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)
数据库·学习·oracle
zhengfei61110 小时前
Chroma DB — 未经授权的信息披露
数据库
KaiwuDB10 小时前
KaiwuDB 获评“2025 中国大数据产业年度国产化优秀代表厂商”
数据库
百***074511 小时前
一步API+Gemini 3.0 Pro进阶实战:多模态开发、性能调优与项目落地
数据库·microsoft
不想写bug呀11 小时前
Redis主从复制介绍
数据库·redis
颜颜yan_11 小时前
Oracle 迁移到 KingbaseES 实战:从评估到追平的一套可落地流程
数据库·oracle