首页/数据/数据库速查/NULL 处理函数:IFNULL / COALESCE / NULLIF
SQL 语法52 条

NULL 处理函数:IFNULL / COALESCE / NULLIF

空值兜底与判定:IFNULL 二元兜底、COALESCE 多级兜底、NULLIF 相等时返回 NULL;聚合与运算前做兜底避免整列 NULL。

数据库速查数据更新于 2026-10-13

NULL 处理函数是什么

SQL 里的空值不是零也不是空字符串,它参与算术与比较的结果仍为空值,因此需要专门的函数兜底:IFNULL 做二元替换、COALESCE 做多级兜底、NULLIF 在两者相等时返回空值(常用于避免除零)。判断是否为空必须用 IS NULL,不能用等号。

基本信息

二元兜底IFNULL(expr, 替代值),仅 MySQL 与部分数据库支持
多级兜底COALESCE(a, b, c …),返回第一个非空值,标准 SQL
相等转空NULLIF(a, b),a 等于 b 时返回空值
判断语法IS NULL / IS NOT NULL,不能用 = NULL
聚合口径除 COUNT(*) 外,聚合函数会跳过空值

典型使用场景

  • 展示层兜底:手机号、备注为空时显示占位文案,避免前端出现空白
  • 多来源取值:取消原因、完成原因、默认值依次兜底取第一个有值的
  • 防除零:把分母为 0 转成空值,让整行结果为未定义而不是报错
  • 报表口径澄清:统计前明确空值是计入还是跳过,避免总数对不上
  • 数据清洗:把空值统一替换为默认值后再参与计算

常用示例

常用示例
SELECT IFNULL(phone, 'N/A') AS phone FROM users;                    -- 二元兜底
SELECT COALESCE(cancel_reason, finish_reason, 'unknown') AS reason   -- 多级兜底
FROM jobs;
SELECT qty, NULLIF(qty, 0) AS qty_or_null FROM order_items;          -- 防除零
SELECT 1 + NULL AS r;                                               -- 结果为 NULL
SELECT COUNT(*), COUNT(phone) FROM users;                            -- 口径差异
SELECT SUM(amount) / NULLIF(COUNT(*), 0) AS avg_amount FROM orders;  -- 安全除

函数对照

函数参数返回典型用途
IFNULL两个第一个非空参数单层兜底,写法最简
COALESCE两个及以上第一个非空参数多来源取值与默认值链
NULLIF两个相等时为空值把零值转为空以免除零
IF三个条件成立取一个值条件分支,不专用于空值
空值参与算术运算结果恒为空值,空值参与比较(等于、不等于)也永不为真,这是最容易被忽略的两条语义。
用 IS NULL 判断外还有空字符串与零值两种伪空:如果业务把空字符串当空值用,只判 IS NULL 会漏掉大量记录。
排序与分组时空值行为也要留意:升序时空值排在最前、降序时排在最后,分组时空值自成一组的处理方式要与业务口径对齐。

易错点

  • IFNULL 只接受两个参数:写三个直接报参数个数错误,多级兜底要用 COALESCE
  • 写成 WHERE col = NULL:条件永远不成立,结果集为空且不报错,极难发现
  • 聚合统计忽略空值口径:平均值与计数的分母不一致,报表数字无法解释
  • 把空值与空字符串混为一谈:数据清洗后口径仍然混乱

数据来源与参考

  • MySQL 8.0 Reference Manual: Flow Control Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌