0
点赞
收藏
分享

微信扫一扫

【MySQL】COALESCE 函数

一、核心作用

返回 参数列表中第一个非 NULL 的值 。当某个字段可能为 NULL,但你需要一个默认值(比如 0'未知' 等)时,用它直接替换,避免因 NULL 导致计算或展示异常。

二、语法结构

COALESCE(值1, 值2, 值3, ...)

  • 参数说明
    依次检查每个参数,返回 第一个非 NULL 的值 。如果所有参数都是 NULL,则返回 NULL(不过实际使用时,通常最后会放一个默认值,确保不会返回 NULL)。

三、实战示例

1. 基础用法:替换 NULL 为默认值

假设有表 products

id

product_name

price

discount

1

手机

5000

500

2

电脑

8000

NULL

计算实际支付价格(原价 - 折扣),若折扣为 NULL 则按无折扣算:

SELECT 
  product_name,
  price,
  discount,
  price - COALESCE(discount, 0) AS final_price  -- 折扣为NULL时按0算
FROM products;

结果:

product_name

price

discount

final_price

手机

5000

500

4500

电脑

8000

NULL

8000

2. 多参数场景:从多个字段取有效值

假设有表 users,用户可能填邮箱或手机号:

id

email

phone

1

test@a.com

NULL

2

NULL

13800138

3

NULL

NULL

优先获取邮箱,邮箱为空则取手机号,都为空则显示 '未填写'

SELECT 
  id,
  COALESCE(email, phone, '未填写') AS contact_info
FROM users;

结果:

id

contact_info

1

test@a.com

2

13800138

3

未填写

3. 结合聚合函数:避免 NULL 影响统计结果

统计 orders 表的总金额(amount 字段可能为 NULL):

SELECT 
  SUM(COALESCE(amount, 0)) AS total_amount  -- 把NULL转为0,避免SUM结果为NULL
FROM orders;

四、对比 IFNULLCASE WHEN

函数

适用场景

示例

COALESCE

从多个值中取第一个非 NULL 的值

COALESCE(a, b, '默认值')

IFNULL

仅处理单字段 NULL 替换

IFNULL(字段, '默认值')

CASE WHEN

复杂条件判断(不仅限于 NULL

CASE WHEN a IS NULL THEN b ELSE a END

三者等价示例:

-- 需求:若 discount 为 NULL,返回 0
COALESCE(discount, 0)  -- 最简写法
IFNULL(discount, 0)    -- 专门处理NULL的简写
CASE WHEN discount IS NULL THEN 0 ELSE discount END  -- 通用写法

五、常见场景

  1. 数据清洗:导入数据时,将 NULL 替换为合理默认值(如 0'未知')。
  2. 报表计算:避免 NULL 导致求和、平均等统计结果异常。
  3. 展示优化:前端展示时,把 NULL 转为用户友好的文案(如 '未填写''待确认'

六、注意事项

  1. 参数类型需兼容
    所有参数最好是同类型(如都是数值或字符串),否则可能触发隐式类型转换(如字符串和数字混合),导致结果不符合预期。
  2. 性能差异
    COALESCEIFNULL 性能接近,远高于 CASE WHEN(尤其是大数据量时),优先用前两者。
  3. 嵌套使用
    可以嵌套多层,比如 COALESCE(a, COALESCE(b, c)),但建议保持简单,避免逻辑复杂难维护。
举报

相关推荐

0 条评论