0Pricing
Coding Interview Prep · 课时

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 NULL

NULLIF:相反的方向

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 三值逻辑与 UNKNOWN
  2. IS NULL、IS NOT NULL 与 NULL 安全相等
  3. COALESCE、NULLIF 与 ISNULL
  4. 汇总、连接和 DISTINCT 中的 NULL
← 返回 Coding Interview Prep