滨州市文章资讯

快速掌握SQL 中的 COALESCE、NULLIF 和 IFNULL 函数

2026-03-24 13:04:01 浏览次数:2
详细信息

SQL 中的 COALESCENULLIFIFNULL 是处理 NULL 值的关键函数,掌握它们能让你写出更健壮、简洁的查询。

简单来说,它们都与 “如果...否则...” 的逻辑相关。下面我们快速、清晰地拆解这三个函数。

1. COALESCE - “返回第一个非 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 就换下一个备选” 工具箱。

2. IFNULL - “COALESCE 的两个参数特例版”

示例 (MySQL):
-- 和上面的 COALESCE 示例效果完全一样
SELECT 
    product_name,
    price,
    discount_price,
    IFNULL(discount_price, price) AS final_price
FROM products;

一句话总结 IFNULL:MySQL 中 COALESCE(值, 备用值) 的快捷写法。建议了解它,但为了跨数据库兼容性,可以习惯使用 COALESCE

3. NULLIF - “制造 NULL 的特殊工具”

示例1:避免除零错误

计算员工奖金占比,但 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 值的表,分别用这三个函数写几个查询,立刻就能感受到它们的作用和区别。

相关推荐