数据库函数详解:COALESCE 到底有什么用?
在写 SQL 的时候,我们经常会遇到这样的场景:
有些字段的值可能是 NULL
,但我们希望结果里总能返回一个“靠谱的值”。这时候,COALESCE
就能派上用场。
1. COALESCE 是什么?
COALESCE(expr1, expr2, expr3, …)
👉 它的作用是 从左到右依次判断参数,返回第一个不是 NULL 的值。
换句话说:
- 如果
expr1
有值(不是 NULL),返回expr1
; - 否则返回
expr2
; - 如果前两个都是 NULL,就返回
expr3
; - 以此类推。
这在处理默认值、兜底逻辑的时候特别常用。
2. 基础示例
假设我们有一张商品表 product
,里面有两个字段:
sale_price
:销售价格purchase_price
:采购价格
还有一张单独价格表 product_price
:
price
:给某个客户/供应商设置的单独价格(可能为空)
现在我们执行 SQL:
SELECT COALESCE(price.price, p.sale_price) AS final_price
FROM product p
LEFT JOIN product_price price ON p.id = price.product_id;
- 如果
price.price = 120
→ 返回120
(优先用单独设置的价格) - 如果
price.price = NULL
且p.sale_price = 100
→ 返回100
- 如果两个都为
NULL
→ 返回NULL
是不是很直观?
3. 和 CASE WHEN 对比
我们不使用 COALESCE
的话,通常写成这样:
CASE WHEN price.price IS NOT NULL THEN price.priceELSE p.sale_price
END AS final_price
看起来就比较啰嗦。
而用 COALESCE
:
COALESCE(price.price, p.sale_price) AS final_price
一行搞定,简洁明了。
4. 在实际业务中的应用
比如你要写一个接口,返回商品的价格。
需求是:
- 如果是客户,优先返回客户的单独价格,否则返回销售价格。
- 如果是供应商,优先返回供应商的单独价格,否则返回采购价格。
SQL 可以写成:
CASE WHEN #{partnerType} = 1 THEN COALESCE(price.price, p.sale_price) WHEN #{partnerType} = 2 THEN COALESCE(price.price, p.purchase_price) ELSE NULL
END AS price
这样就能保证:
- 有单独价格时,返回单独价格;
- 没有单独价格时,返回默认价格;
- 逻辑清晰,代码简洁。
5. 总结
- 记忆口诀:
COALESCE(a, b)
= 如果a
不为空,就返回a
,否则返回b
。 - 优点:简洁、可读性强,替代冗长的
CASE WHEN
。 - 适用场景:字段可能为 NULL 时,设置默认值或兜底逻辑。
💡 一句话总结:
COALESCE
是 SQL 里的“兜底神器”,帮你在 NULL
值面前永远不至于掉链子。