COALESCE、NULLIF 与 ISNULL
替换默认值,并了解 COALESCE 与供应商专用函数的区别
COALESCE、NULLIF 与 ISNULL 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
用值替换 NULL
现在您已经能够检测 NULL,下一项面试技能就是用合理的默认值替换它。可移植的标准工具是 COALESCE。
除此之外,您还会遇到 NULLIF,它通过将特定值转换为 NULL 走相反方向;还会遇到 ISNULL(SQL Server)和 IFNULL(MySQL)这两个厂商函数,候选人经常将它们与 COALESCE 混淆。
准确了解它们各自的差异,尤其是参数数量和返回类型,是常见的初筛问题。
COALESCE 基础
COALESCE 接受任意数量的参数,从左到右扫描并返回第一个非 NULL 参数。如果所有参数都是 NULL,则返回 NULL。
它符合 ANSI 标准,并且适用于所有主流数据库,因此应当作为您的默认回答。您可以用它为显示、计算或分组提供回退值。
-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;
-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;COALESCE 具有短路特性
面试官经常考察一个细节:COALESCE 从概念上会按从左到右的顺序计算参数,并在遇到第一个非 NULL 值时停止。因此,一旦前面的参数得到结果,后面开销较大的表达式就不需要求值。
但在实际中,某些数据库引擎的优化器仍可能采用急切求值,所以不要依赖这一点来避免除零等错误。不过,哪个值最终胜出时的从左到右优先级是有保证的。
-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;COALESCE 与结果数据类型
一个容易忽略的陷阱:COALESCE 结果的数据类型由其所有参数合并后的类型优先级决定,而不只是由第一个参数决定。混合使用不兼容的类型可能导致错误或意外截断。
例如,对一个整数列和一个字符串默认值使用 COALESCE 时,根据数据库引擎的不同,操作可能失败或发生隐式类型转换。面试官借此测试您是否会考虑类型。
-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;
-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;ISNULL(SQL Server)与 COALESCE
SQL Server 提供 ISNULL(expr, replacement)。它看起来像 COALESCE,但在一些面试官喜欢对比的重要方面有所不同:
- 参数数量:ISNULL 恰好接受两个参数;COALESCE 可以接受多个参数。
- 返回类型:ISNULL 使用第一个参数的类型,这可能截断替代值。COALESCE 使用合并后的类型优先级。
- 可移植性:ISNULL 仅适用于 SQL Server;COALESCE 是 ANSI 标准。
建议您明确说明:为确保可移植性和类型可预测,优先使用 COALESCE。
-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'
-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;IFNULL 与 NVL
其他方言还有各自的双参数简写形式:
- MySQL / SQLite:
IFNULL(expr, replacement) - Oracle:
NVL(expr, replacement),此外还有NVL2,可实现条件分支变体
这三者的行为都类似于双参数 COALESCE。如果问题明确要求 MySQL 或 Oracle 的惯用写法,请说出相应函数;否则优先使用 COALESCE。
-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;
-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULLNULLIF:相反的方向
NULLIF(a, b) 在 a = b 时返回 NULL,否则返回 a。它会主动创建一个 NULL,这与 COALESCE 的方向相反。
它最常见的用途是防止除零。将分母包裹在 NULLIF(denominator, 0) 中:如果分母为零,除数会变为 NULL,整个除法会返回 NULL,而不会抛出错误。
-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;
-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5组合使用 NULLIF 和 COALESCE
这两个函数配合得非常好。一个经典的面试单行写法是“在没有订单时显示 0 的安全除法”。使用 NULLIF 避免错误,然后使用 COALESCE 替换由此产生的 NULL。
这种简洁的惯用写法体现了熟练度:您在一个表达式中同时处理边界情况和展示效果。
SELECT
COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;
-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0将空字符串视为 NULL
NULLIF 的另一个实用用途是:将空白字符串归并为 NULL,以便统一使用合并逻辑。脏数据经常同时包含 NULL 和 '';这种处理可以将两者标准化。
可以这样理解这个模式:“如果值为空,就将其设为 NULL,然后回退到默认值。”这是回答“如何以相同方式处理空白值和缺失值?”这一问题时,简洁且可移植的方案。
-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;深入示例:跨 JOIN 使用 COALESCE
在 LEFT JOIN 之后,不匹配的行会在右侧产生 NULL。COALESCE 会在输出中将这些 NULL 转换为有意义的默认值,这是非常常见的报表需求。
这里,没有订单的客户仍会显示出来(得益于 LEFT JOIN),其总额会显示为 0 而不是 NULL。提到 COALESCE 发生在 JOIN 之后而不是 JOIN 内部,说明您理解求值顺序。
SELECT
c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULL面试要点
替代值工具集总结:
- COALESCE(a, b, ...):返回第一个非 NULL 值,支持多个参数,符合 ANSI 标准,类型由优先级决定。默认选择。
- ISNULL / IFNULL / NVL:双参数厂商简写;ISNULL 可能将结果截断为第一个参数的类型。
- NULLIF(a, b):相等时返回 NULL;非常适合防止除零和规范化空白值。
- 组合使用
COALESCE(x / NULLIF(y, 0), 0),实现安全且便于展示的除法。
先回答 COALESCE,只有在方言固定时才提及厂商变体。
快速检查
请选择安全的除法表达式。
回顾
现在您已经可以替换和生成 NULL:
- COALESCE 返回多个参数中的第一个非 NULL 值,是可移植的默认选择。
- ISNULL(SQL Server)、IFNULL(MySQL)和 NVL(Oracle)都是双参数简写;ISNULL 可能将结果截断为第一个参数的类型。
- NULLIF(a, b) 在两个值相等时返回 NULL,非常适合防止除零和规范化空字符串。
- 组合使用这些函数,可以构建安全且便于展示的表达式,并为 LEFT JOIN 之后产生的 NULL 提供默认值。
最后一课:NULL 在聚合、连接和 DISTINCT 中的行为。
常见问题解答
「COALESCE、NULLIF 与 ISNULL」课时是免费的吗?
是的 — 「COALESCE、NULLIF 与 ISNULL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「COALESCE、NULLIF 与 ISNULL」这节课中我会学到什么?
替换默认值,并了解 COALESCE 与供应商专用函数的区别 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「COALESCE、NULLIF 与 ISNULL」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 三值逻辑与 UNKNOWN
- IS NULL、IS NOT NULL 与 NULL 安全相等
- COALESCE、NULLIF 与 ISNULL
- 汇总、连接和 DISTINCT 中的 NULL