SQL 中的 COALESCE、NULLIF 和 IFNULL 是处理 NULL 值的关键函数,掌握它们能让你写出更健壮、简洁的查询。
简单来说,它们都与 “如果...否则...” 的逻辑相关。下面我们快速、清晰地拆解这三个函数。
这是你最常用、功能最强大的一个。
COALESCE(value1, value2, value3, ..., valuen)NULL 的值。NULL 字段提供默认值、拼接可能为 NULL 的字段。假设有一个 products 表,有些产品的折扣价 (discount_price) 可能为 NULL。
SELECT
product_name,
price,
discount_price,
-- 如果 discount_price 为 NULL,则使用 price
COALESCE(discount_price, price) AS final_price
FROM products;
结果可能如下: | product_name | price | discount_price | final_price | | :--- | :--- | :--- | :--- | | 产品A | 100 | 80 | 80 | | 产品B | 200 | NULL | 200 (使用了price) |
更复杂的例子: 它不限于两个参数。
-- 优先用手机号,没有则用邮箱,再没有则用固定电话,都没有则返回 ‘N/A’
SELECT COALESCE(phone, email, home_phone, ‘N/A’) AS contact_info
FROM users;
一句话总结 COALESCE:你的 SQL 查询里的 “如果为 NULL 就换下一个备选” 工具箱。
IFNULL(value, alternative_value)value 是 NULL,则返回 alternative_value;否则返回 value 本身。COALESCE(value, alternative_value) 来实现完全相同功能。-- 和上面的 COALESCE 示例效果完全一样
SELECT
product_name,
price,
discount_price,
IFNULL(discount_price, price) AS final_price
FROM products;
一句话总结 IFNULL:MySQL 中 COALESCE(值, 备用值) 的快捷写法。建议了解它,但为了跨数据库兼容性,可以习惯使用 COALESCE。
NULLIF(value1, value2)value1 等于 value2,则返回 NULL;否则返回 value1。NULL。计算员工奖金占比,但 sales_target 可能为 0。
SELECT
name,
sales,
sales_target,
-- 如果目标为0,则避免除零错误,返回NULL
sales / NULLIF(sales_target, 0) AS achievement_rate
FROM sales_staff;
示例2:清理数据
数据中用了 ‘N/A’ 表示缺失,你想将其转为标准的 NULL 以便用 COALESCE 处理。
SELECT
user_id,
-- 将 'N/A' 转换为 NULL
NULLIF(phone_number, ‘N/A’) AS clean_phone
FROM contacts;
一句话总结 NULLIF:“如果相等,就返回 NULL”。常用于数据清理和安全防护。
| 函数 | 语法 | 核心逻辑 | 类比 |
|---|---|---|---|
COALESCE |
(val1, val2, …) |
返回第一个非 NULL | “找备胎”:从第一个开始找,找到第一个能用的(非NULL)就停。 |
IFNULL |
(val, alt) |
如果 val 是 NULL 就用 alt | “MySQL 的备用计划”:一个简单的两参数版 COALESCE。 |
NULLIF |
(val1, val2) |
如果相等就返回 NULL | “相等就归零”:专门用来在特定条件下制造 NULL。 |
COALESCE:它能做 IFNULL 的所有事,而且更强大、更通用。优先学习它。
理解 NULLIF 的逆向思维:它不是用来处理已有的 NULL,而是在特定条件下主动生成 NULL,常与其他函数(如 COALESCE)配合使用。
记住经典组合拳:-- 经典模式:先清理/标准化数据,再提供默认值
SELECT COALESCE(
NULLIF(phone, ‘N/A’), -- 第一步:把‘N/A’变成NULL
‘未提供’ -- 第二步:为NULL提供默认值
) AS final_contact
FROM users;
实践建议:在你的数据库中找一个有 NULL 值的表,分别用这三个函数写几个查询,立刻就能感受到它们的作用和区别。