SELECT 中的 CASE 表达式
编写内联条件逻辑,并区分搜索型 CASE 与简单 CASE
SELECT 中的 CASE 表达式 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
CASE:SQL 的条件表达式
CASE 相当于 SQL 中的 if/then/else,但它是一个返回单个值的表达式,因此凡是可以使用值的地方都能使用它:SELECT、WHERE、ORDER BY,甚至聚合函数内部。
SELECT order_id,
amount,
CASE WHEN amount > 100 THEN 'large' ELSE 'small' END AS size
FROM orders;搜索式 CASE 形式
搜索式 CASE 会针对每个 WHEN 检查一个布尔条件,并返回第一个匹配项。它是最灵活的形式,而且顺序很重要——第一个为真的条件会生效。
SELECT score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END AS grade
FROM exam_results;简单 CASE 形式
简单式 CASE 会将一个表达式与一组值进行比较。它适合相等性检查,写法更短,但无法处理范围或 NULL 检查。
SELECT status_code,
CASE status_code
WHEN 1 THEN 'active'
WHEN 2 THEN 'paused'
WHEN 3 THEN 'closed'
ELSE 'unknown'
END AS status_label
FROM accounts;搜索式与简单式:如何选择
对于与固定值进行相等比较,请使用简单式 CASE;对于范围或 NULL,请使用搜索式 CASE。关键陷阱是:简单式 CASE 永远无法匹配 NULL——请在搜索式中使用 IS NULL。
-- Simple CASE will NOT catch NULL here
SELECT CASE WHEN bonus IS NULL THEN 'no bonus'
ELSE 'has bonus'
END AS bonus_flag
FROM employees;WHEN 分支的顺序很重要
由于第一个匹配的分支会生效,请按照从具体到宽泛的顺序排列 WHEN。若先放置宽泛的阈值,得分 95 的值就可能被错误标记。
-- Correct order: highest threshold first
SELECT CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C or below'
END AS grade
FROM exam_results;ELSE 与隐式 NULL
如果没有任何匹配项且省略了 ELSE,CASE 会返回 NULL。请明确添加 ELSE 作为默认分支,以免意外值静默变成 NULL。
-- No ELSE: anything not 1/2 becomes NULL
SELECT CASE flag WHEN 1 THEN 'yes' WHEN 2 THEN 'no' END AS label
FROM toggles;条件聚合(透视表模式)
面试中最有价值的技巧是:条件聚合。将 CASE 放入 SUM 或 COUNT 中,一次遍历就能统计每个类别的行数,从而生成简洁的透视表式报表。
SELECT
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders,
SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_revenue
FROM orders;COUNT 会忽略 NULL:CASE 的简写方式
由于 COUNT 会忽略 NULL,您可以省略 ELSE,使不匹配的行变成 NULL,从而不被计数。这是执行条件计数时稍短的一种写法。
SELECT
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_orders
FROM orders;在 ORDER BY 中使用 CASE 实现自定义排序
将 CASE 放入 ORDER BY,可以按照自定义优先级排序,而不是采用普通的字母或数字顺序,例如让紧急项排在普通项之前,再排在其他所有项之前。
SELECT order_id, status
FROM orders
ORDER BY
CASE status
WHEN 'urgent' THEN 1
WHEN 'normal' THEN 2
ELSE 3
END,
order_id;各分支之间的类型一致性
CASE 的所有分支都必须返回兼容的类型。混合使用数字和字符串可能导致错误或强制类型转换——请选择一种输出类型,并在需要时明确进行类型转换。
-- Keep branches the same type
SELECT CASE WHEN qty > 0 THEN CAST(qty AS VARCHAR)
ELSE 'none'
END AS qty_label
FROM inventory;在 WHERE 中使用 CASE 进行条件筛选
WHERE 中的 CASE 可以根据某个标志应用不同的筛选逻辑,例如为每个地区设置不同的价格阈值。与纠结于一长串 AND 和 OR 相比,这种方式通常更加清晰。
SELECT order_id, amount, region
FROM orders
WHERE amount > CASE region
WHEN 'US' THEN 100
WHEN 'EU' THEN 90
ELSE 50
END;快速检查
预测结果。
回顾
回顾:CASE 返回一个值,可用于 SELECT、WHERE、ORDER BY 和聚合函数。搜索式 CASE 处理范围和 NULL;第一个匹配项生效;没有匹配项时返回 NULL;请保持各分支的类型兼容。
常见问题解答
「SELECT 中的 CASE 表达式」课时是免费的吗?
是的 — 「SELECT 中的 CASE 表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「SELECT 中的 CASE 表达式」这节课中我会学到什么?
编写内联条件逻辑,并区分搜索型 CASE 与简单 CASE 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「SELECT 中的 CASE 表达式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 列投影与别名陷阱
- 计算列与表达式优先级
- DISTINCT 与 GROUP BY 的去重比较
- SELECT 中的 CASE 表达式