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。
性能提示
- 合理安排条件顺序 — 把最有可能匹配的条件放在前面
- 避免重复计算 — CASE 按顺序求值,一旦匹配就停止
- 为相关列建立索引 — 如果 CASE 中使用列比较,索引可以提升性能
- 考虑计算列 — 对于经常使用的 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 如何简化你的条件逻辑。