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 会漏掉大量记录。
排序与分组时空值行为也要留意:升序时空值排在最前、降序时排在最后,分组时空值自成一组的处理方式要与业务口径对齐。