COALESCE 与 NULLIF
提供默认值并避免除以零
COALESCE 与 NULLIF 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
替换缺失值
检测 NULL 只是完成了一半 — 您通常还需要将其替换为合理的默认值。SQL 的 COALESCE 函数正是用于此目的。
而当您想要有意创建 NULL 时(例如避免除以零),NULLIF 就是合适的工具。本课将介绍这两个函数。
-- Show a placeholder when phone is missing
SELECT name, COALESCE(phone, 'no phone on file') AS phone
FROM customers;COALESCE 的工作原理
COALESCE 可以接受任意数量的参数,并从左到右返回第一个非 NULL 参数。
如果所有参数都是 NULL,结果就是 NULL。您可以将它理解为“使用这个值,否则使用那个值,最后使用这个备用值”。
SELECT
COALESCE(NULL, NULL, 'third', 'fourth') AS a, -- 'third'
COALESCE(NULL, 42) AS b, -- 42
COALESCE(NULL, NULL) AS c; -- NULL串联备用值
由于 COALESCE 可以接受多个参数,您可以构建一条优先级链。
例如,优先使用手机号,然后使用工作电话,再使用家庭电话,最后使用一条字面消息。
SELECT name,
COALESCE(mobile, work_phone, home_phone, 'unreachable') AS best_contact
FROM contacts;计算中的默认值
NULL 会在算术运算中传播,因此单个缺失值就可能使整个计算结果变为 NULL。将可能为 NULL 的输入包裹在 COALESCE 中,以替换为中性值。
这里,缺失的折扣会按 0 处理。
-- Without COALESCE, a NULL discount makes total NULL
SELECT
price - COALESCE(discount, 0) AS total
FROM line_items;COALESCE 的类型规则
COALESCE 的所有参数都必须具有兼容的类型。PostgreSQL 会选择一种共同类型;如果无法选择,就会报错。
例如,您不能在不进行类型转换的情况下混合数字和普通文本字符串 — 备用值也必须是数字。
-- OK: both integers
SELECT COALESCE(score, 0) FROM results;
-- Cast when mixing types
SELECT COALESCE(score::text, 'n/a') FROM results;认识 NULLIF
从原理上看,NULLIF(a, b) 与 COALESCE 相反:当 a = b 时返回 NULL,否则返回 a。
它可以简洁地将特定的“标记值”转换为真正的 NULL。
SELECT
NULLIF(5, 5) AS a, -- NULL (equal)
NULLIF(5, 9) AS b, -- 5 (not equal)
NULLIF('', '') AS c; -- NULL (treat empty string as missing)使用 NULLIF 避免除以零
NULLIF 的经典用途是避免除法错误。除以 0 会报错,但除以 NULL 只会得到 NULL。
将除数包裹在 NULLIF(divisor, 0) 中,就能将崩溃转换为安全的 NULL。
-- If total_visits is 0, this would error.
-- NULLIF turns the divisor into NULL, giving a NULL ratio instead.
SELECT
conversions / NULLIF(total_visits, 0) AS conversion_rate
FROM campaigns;结合使用 NULLIF 和 COALESCE
NULLIF 和 COALESCE 配合得很好。使用 NULLIF 将标记值转换为 NULL,然后使用 COALESCE 为这个 NULL 提供友好的默认值。
这里,空字符串备注会变成字面文本 "—"。
-- Treat '' as missing, then display a dash
SELECT
COALESCE(NULLIF(note, ''), '—') AS display_note
FROM tickets;安全计算平均比率
将这些方法结合起来,构建稳健的分析查询:使用 NULLIF 防止除以零,然后使用 COALESCE 将 NULL 显示为 0。
该查询永远不会报错,并且始终显示整洁的数字。
SELECT
product_id,
COALESCE(returns / NULLIF(orders, 0), 0) AS return_rate
FROM product_stats;COALESCE 与 IS NULL 的比较
两者都用于处理 NULL,但目标不同:
IS NULL/IS NOT NULL— 在条件中检查缺失值。COALESCE— 在输出中替换一个值。
组织结果时使用 COALESCE,筛选数据时使用 IS NULL。
-- Filter (IS NULL)
SELECT * FROM customers WHERE phone IS NULL;
-- Substitute (COALESCE)
SELECT COALESCE(phone, 'unknown') FROM customers;综合运用
本课速查:
COALESCE(a, b, c)→ 第一个非 NULL 值。NULLIF(a, b)→ 相等时为 NULL,否则为a。- 使用
NULLIF(divisor, 0)避免除以零。 - 使用
COALESCE为计算结果和输出提供默认值。
SELECT
COALESCE(nickname, full_name, 'guest') AS display_name,
revenue / NULLIF(orders, 0) AS avg_order_value
FROM accounts;快速检查
当 amount 为 0 时,NULLIF(amount, 0) 会返回什么?
回顾
现在,您可以使用 COALESCE(第一个非 NULL 值优先)将 NULL替换为默认值,也可以使用 NULLIF(两个值匹配时返回 NULL)有意创建 NULL。
您了解了避免除以零的模式,以及如何串联使用这两个函数来生成安全、整洁的输出。接下来,您将探索 NULL 在 COUNT、SUM 和连接中的行为。
SELECT
COALESCE(NULLIF(comment, ''), 'no comment') AS comment,
total / NULLIF(qty, 0) AS unit_price
FROM invoices;常见问题解答
「COALESCE 与 NULLIF」课时是免费的吗?
是的 — 「COALESCE 与 NULLIF」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「COALESCE 与 NULLIF」这节课中我会学到什么?
提供默认值并避免除以零 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「COALESCE 与 NULLIF」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- NULL 的真正含义
- IS NULL 与 IS NOT NULL
- COALESCE 与 NULLIF
- 聚合和连接中的 NULL