SQL条件表达式 CASE WHEN语句的多种用法实例

SQL条件表达式 CASE WHEN语句的多种用法实例
最新回答
南极星老奶奶

2026-10-17 10:34:19

SQL条件表达式CASE WHEN语句的多种用法实例

SQL的CASE WHEN语句通过在查询中嵌入条件判断逻辑,实现根据不同条件返回不同值的功能。以下是其核心用法及实例:

1. 简单CASE WHEN表达式

用途:将表达式的值与一系列可能值匹配,返回对应结果。示例:将订单状态代码转换为中文描述。

SELECT order_id, CASE order_status WHEN '1' THEN '待付款' WHEN '2' THEN '待发货' WHEN '3' THEN '已发货' WHEN '4' THEN '已完成' ELSE '未知状态' END AS order_status_description FROM orders;

效果:若order_status为'1',则返回'待付款';若为其他值,返回'未知状态'。

2. 搜索CASE WHEN表达式

用途:支持复杂条件运算符(如>、<、LIKE、BETWEEN等),实现灵活判断。示例:根据订单金额分级。

SELECT order_id, CASE WHEN order_amount > 1000 THEN 'VIP订单' WHEN order_amount > 500 THEN '高级订单' WHEN order_amount > 100 THEN '普通订单' ELSE '小型订单' END AS order_level FROM orders;

效果:若order_amount为1200,则返回'VIP订单';若为600,则返回'高级订单'。

3. 与聚合函数结合

用途:统计不同条件下的数据量(如订单状态数量)。示例:统计各状态订单数量。

SELECT SUM(CASE WHEN order_status = '1' THEN 1 ELSE 0 END) AS pending_payment_count, SUM(CASE WHEN order_status = '2' THEN 1 ELSE 0 END) AS to_be_shipped_count, SUM(CASE WHEN order_status = '3' THEN 1 ELSE 0 END) AS shipped_count, SUM(CASE WHEN order_status = '4' THEN 1 ELSE 0 END) AS completed_count FROM orders;

效果:返回各状态订单的计数,如pending_payment_count为待付款订单数。

4. 实现行转列

用途:将行数据转换为列展示(如月份销售额转列)。示例:将sales表中的月份销售额转为列格式。

SELECT SUM(CASE WHEN month = 1 THEN sales_amount ELSE 0 END) AS month_1, SUM(CASE WHEN month = 2 THEN sales_amount ELSE 0 END) AS month_2, SUM(CASE WHEN month = 3 THEN sales_amount ELSE 0 END) AS month_3 FROM sales;

效果:若原始数据为(1,100)、(2,150)、(3,200),则结果为month_1=100、month_2=150、month_3=200。

5. 嵌套使用

用途:实现多层级条件判断(如根据用户等级和订单金额计算折扣)。示例:根据用户等级和订单金额计算折扣后金额。

SELECT order_id, CASE WHEN user_level = 'VIP' THEN CASE WHEN order_amount > 1000 THEN order_amount * 0.8 ELSE order_amount * 0.9 END ELSE CASE WHEN order_amount > 500 THEN order_amount * 0.9 ELSE order_amount * 0.95 END END AS discounted_amount FROM orders;

效果:若用户为VIP且订单金额为1200,则返回960(1200×0.8);若为普通用户且金额为600,则返回540(600×0.9)。

6. 性能优化与常见错误
  • 性能考虑:避免冗余嵌套,复杂逻辑可定义为用户自定义函数(UDF)。
  • 常见错误:

    遗漏ELSE子句:未匹配条件时返回NULL,可能导致计算错误。

    数据类型不一致:THEN和ELSE子句需返回相同或可隐式转换的类型。

    条件顺序冲突:多个WHEN条件为真时,仅返回第一个匹配的结果。

7. 不常见应用场景
  • 数据清洗:统一不一致的编码或格式(如将多种日期格式转为YYYY-MM-DD)。
  • 权限控制:根据用户角色显示不同数据(如管理员查看全部订单,普通用户仅查看自己的订单)。

总结:CASE WHEN语句通过灵活的条件判断,支持数据转换、统计、行转列、嵌套逻辑等场景。掌握其用法可显著提升SQL查询的效率和可读性。