SQL CASE 语句:在查询中实现条件逻辑

Published: 2026-02-11

CASE 语句是 SQL 在查询中添加条件逻辑的方式。它的作用类似 if-then-else 语句,可以根据条件返回不同的值。CASE 在所有主流 SQL 数据库中都受支持,包括 SQLite、PostgreSQL、MySQL、SQL Server 和 Oracle。

示例数据

下面所有示例都使用两张表:

products 表:

id name category price stock rating
1 Laptop Pro Electronics 1299.99 15 4.5
2 Wireless Mouse Electronics 29.99 50 4.2
3 Office Chair Furniture 249.99 8 4.7
4 Desk Lamp Furniture 39.99 25 3.9
5 Notebook Pack Stationery 12.99 100 4.0
6 Pen Set Stationery 8.99 75 3.5
7 Monitor 27" Electronics 399.99 0 4.6
8 Standing Desk Furniture 599.99 3 4.8

orders 表:

id product_id quantity order_date status
1 1 2 2026-02-01 delivered
2 2 5 2026-02-03 shipped
3 3 1 2026-02-05 processing
4 4 3 2026-02-06 delivered
5 5 10 2026-02-07 shipped
6 1 1 2026-02-08 cancelled
7 7 1 2026-02-09 pending
8 8 1 2026-02-10 processing

简单 CASE 表达式

简单 CASE 表达式将某个列或表达式与具体值进行比较。在只检查相等关系时,它写起来更简洁。

语法

CASE column_name
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ELSE default_result
END

示例:订单状态分类

把订单状态代码转换成更友好的标签:

搜索型 CASE 表达式

搜索型 CASE 表达式会计算布尔条件,允许使用复杂比较和区间判断。

语法

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ELSE default_result
END

示例:价格区间分类

按价格区间对产品进行分类:

示例:库存状态

根据不同阈值判断库存状态:

在计算中使用 CASE

CASE 语句可以用来调整计算逻辑、应用条件公式或处理 NULL 值。

示例:按类别应用折扣

根据产品类别计算折扣价:

示例:按金额和状态确定订单优先级

根据多种因素计算订单优先级:

在聚合中使用 CASE

在聚合函数中使用 CASE,可以创建类似数据透视表的报表或条件计数。

示例:按库存状态统计产品数量

统计每种库存状态下有多少产品:

示例:按类别和状态统计收入

使用条件聚合计算不同指标:

在 ORDER BY 中使用 CASE

在 ORDER BY 中使用 CASE,可以实现自定义排序逻辑。

示例:自定义排序顺序

按自定义优先级排序产品(先缺货,再按评分排序):

嵌套 CASE 语句

可以嵌套使用 CASE 表达式,以实现更复杂的逻辑。

示例:复杂的产品分类

结合多种条件进行更细致的分类:

CASE 语句的常见用法

  • 数据分类 — 将数值划分到不同区间或类别
  • 条件格式化 — 显示更友好的标签或状态指示
  • 动态计算 — 根据条件应用不同的计算公式
  • 创建透视表 — 结合聚合函数生成交叉报表
  • 自定义排序 — 为特殊业务逻辑定义排序顺序
  • 处理 NULL 值 — 替换或标记缺失数据
  • 多条件决策 — 在 SQL 中实现复杂业务规则

CASE vs. IIF 和 COALESCE

  • CASE — 最灵活,可以处理多个条件
  • IIF(condition, true_value, false_value) — 单一条件时更简洁(SQL Server、Access)
  • COALESCE(val1, val2, …) — 返回第一个非 NULL 的值(适合处理 NULL)

SQLite 支持 CASE 和 COALESCE,但不支持 IIF。为了最大兼容性,建议使用 CASE。

性能提示

  1. 合理安排条件顺序 — 把最有可能匹配的条件放在前面
  2. 避免重复计算 — CASE 按顺序求值,一旦匹配就停止
  3. 为相关列建立索引 — 如果 CASE 中使用列比较,索引可以提升性能
  4. 考虑计算列 — 对于经常使用的 CASE 逻辑,一些数据库支持可建立索引的计算列

小结

  • CASE 为 SQL 查询提供类似 if-then-else 的条件逻辑
  • 简单 CASE 将列与具体值比较:CASE column WHEN value THEN result
  • 搜索型 CASE 计算布尔条件:CASE WHEN condition THEN result
  • 可以在 SELECT、WHERE、ORDER BY 和聚合函数中使用
  • CASE 表达式可以嵌套,用于复杂决策树
  • 始终建议包含 ELSE 分支,以处理意外情况
  • 所有主流 SQL 数据库都支持 CASE,语法基本一致

可以尝试修改这些示例中的条件,观察结果变化,体会 CASE 如何简化你的条件逻辑。