搜索式 CASE 与简单 CASE
编写 CASE 的两种方式
搜索式 CASE 与简单 CASE 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
编写 CASE 的两种方式
SQL 提供了 CASE 表达式的两种形式:简单 CASE 和 搜索式 CASE。两者都会根据条件返回一个值,但条件的写法不同。
完成本课后,您将了解应在何时使用每种形式,以及如何避免混淆两者时常见的错误。
简单 CASE——基本概念
简单 CASE 会将一个表达式与一列值进行比较。您可以把它想象成查找表:在左侧选定一个列或值,然后在每个 WHEN 分支中列出该值等于什么。
语法:CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END
SELECT
product_name,
category_id,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;简单 CASE 实践
这里,CASE 表达式紧跟在关键字之后,列 status 会使用相等比较,依次与每个 WHEN 值进行比较。请注意,在 WHEN 分支中不需要写 status =——比较关系是隐含的。
SELECT
order_id,
status,
CASE status
WHEN 'pending' THEN 'Awaiting payment'
WHEN 'paid' THEN 'Payment received'
WHEN 'shipped' THEN 'On its way'
WHEN 'delivered' THEN 'Completed'
ELSE 'Unknown status'
END AS status_label
FROM orders;搜索式 CASE——基本概念
搜索式 CASE 不会在 CASE 关键字后立即出现表达式。相反,每个 WHEN 分支都包含一个完整的布尔条件。这使其灵活得多:您可以混用不同的列、使用范围检查,或在每个 WHEN 中调用函数。
语法:CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END
SELECT
employee_name,
salary,
CASE
WHEN salary < 30000 THEN 'Entry Level'
WHEN salary < 60000 THEN 'Mid Level'
WHEN salary < 100000 THEN 'Senior'
ELSE 'Executive'
END AS salary_band
FROM employees;搜索式 CASE 实践
由于每个 WHEN 都接受任意布尔表达式,您可以在一个分支中组合多个列。数据库会从上到下计算 WHEN 子句,并返回第一个为 TRUE 的分支的结果。
SELECT
product_name,
stock,
price,
CASE
WHEN stock = 0 THEN 'Out of stock'
WHEN stock < 10 AND price > 100 THEN 'Low stock — premium item'
WHEN stock < 10 THEN 'Low stock'
ELSE 'In stock'
END AS availability
FROM products;核心结构差异
下表概括了核心区别:
简单 CASE — CASE 后有一个表达式,每个 WHEN 都会检查它是否与该表达式相等。
搜索式 CASE — CASE 后没有表达式,每个 WHEN 都是独立的布尔条件。
由于简单 CASE 只能进行相等检查,因此无法处理范围、NULL 或多列条件。除直接值匹配外的任何情况,请使用搜索式 CASE。
-- Simple CASE: equality only
SELECT CASE day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
ELSE 'Other'
END AS day_name
FROM schedule;
-- Searched CASE: any condition
SELECT CASE
WHEN day_number BETWEEN 1 AND 5 THEN 'Weekday'
WHEN day_number IN (6, 7) THEN 'Weekend'
END AS day_type
FROM schedule;NULL 处理——为什么搜索式 CASE 更有优势
简单 CASE 内部使用 =,而在 SQL 中,NULL = NULL 永远不会为 TRUE。因此,简单 CASE 无法匹配 NULL 列。搜索式 CASE 允许您写出 WHEN column IS NULL THEN ...,这样可以正确处理。
-- Simple CASE: NULL branch never matches
SELECT CASE manager_id
WHEN NULL THEN 'No manager' -- this will NEVER fire
ELSE 'Has manager'
END
FROM employees;
-- Searched CASE: correct NULL check
SELECT CASE
WHEN manager_id IS NULL THEN 'No manager'
ELSE 'Has manager'
END AS manager_status
FROM employees;在搜索式 CASE 中混用列
搜索式 CASE 的一大优势是,每个 WHEN 分支都可以引用完全不同的列或调用函数。这让您能够表达简单 CASE 完全无法处理的复杂业务规则。
SELECT
customer_name,
total_orders,
total_spent,
CASE
WHEN total_spent > 10000 AND total_orders > 20 THEN 'VIP'
WHEN total_spent > 5000 THEN 'Gold'
WHEN total_orders > 10 THEN 'Silver'
ELSE 'Standard'
END AS tier
FROM customers;使用 CASE 处理 ORDER BY
两种 CASE 形式都可以放在 ORDER BY 中,用于创建数据中不存在的自定义排序顺序。这里,简单 CASE 将优先级名称映射为数字,使行按业务优先级而非字母顺序排序。
SELECT ticket_id, subject, priority
FROM support_tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
ELSE 5
END ASC;聚合函数中的 CASE
将搜索式 CASE 包裹在 SUM 或 COUNT 中,是条件聚合的经典模式——有时也称为透视。这样您可以在一次扫描中生成多个类别总计,而无需运行多个查询。
SELECT
department,
COUNT(*) AS total_employees,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
SUM(CASE WHEN salary > 70000 THEN salary ELSE 0 END) AS high_earner_payroll
FROM employees
GROUP BY department;选择合适的形式
一个实用的经验法则是:
当您要将单个列映射到一组固定的已知值时,请使用简单 CASE——它更简短,也更易读。
其他所有情况都应使用搜索式 CASE:范围、NULL 检查、多列逻辑,或在条件中调用函数。
遇到不确定的情况时,搜索式 CASE 总能奏效。您甚至可以将任何简单 CASE 改写为搜索式 CASE,但反过来则不行。
-- These two queries return identical results
-- Simple CASE (concise for equality)
SELECT CASE region_code
WHEN 'US' THEN 'United States'
WHEN 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;
-- Equivalent Searched CASE
SELECT CASE
WHEN region_code = 'US' THEN 'United States'
WHEN region_code = 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;快速检查
请测试您对简单 CASE 与搜索式 CASE 的理解。
课程回顾
以下是您在本课中学到的内容:
简单 CASE — 在 CASE 后放置一个表达式;每个 WHEN 都会检查该表达式是否等于某个特定值。最适合将单个列映射到固定的标签列表。
搜索式 CASE — CASE 后没有表达式;每个 WHEN 都包含一个完整的布尔条件。支持范围、NULL 检查、多列逻辑和函数调用。
两种形式都会从上到下计算分支,并返回第一个为 TRUE 的分支的结果。当没有分支匹配且没有 ELSE 时,结果为 NULL。若要获得最大的灵活性,搜索式 CASE 始终是稳妥的选择——它能完成简单 CASE 的所有功能,并且功能更多。
常见问题解答
「搜索式 CASE 与简单 CASE」课时是免费的吗?
是的 — 「搜索式 CASE 与简单 CASE」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「搜索式 CASE 与简单 CASE」这节课中我会学到什么?
编写 CASE 的两种方式 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「搜索式 CASE 与简单 CASE」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- CASE 表达式
- 搜索式 CASE 与简单 CASE
- 数据分桶与标注
- ORDER BY 和聚合中的 CASE