在写 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 = NULLp.sale_price = 100 → 返回 100
  • 如果两个都为 NULL → 返回 NULL

是不是很直观?


3. 和 CASE WHEN 对比

我们不使用 COALESCE 的话,通常写成这样:

CASE 
    WHEN price.price IS NOT NULL THEN price.price
    ELSE 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 值面前永远不至于掉链子。


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐