0Pricing
SQL Academy · 课时

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

此课程中的所有课时

  1. CASE 表达式
  2. 搜索式 CASE 与简单 CASE
  3. 数据分桶与标注
  4. ORDER BY 和聚合中的 CASE
← 返回 SQL Academy