1. SQL CASE 表达式介绍
SQL CASE 表达式是结构化查询语言中经常使用的条件表达式,它允许在 SELECT、UPDATE、INSERT 和 DELETE 语句中根据条件选择不同的操作方式。其基本语法如下:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE resultN
END
其中,expression 是要进行比较的表达式,value1~valueN 是要比较的值,result1~resultN 是在比较满足时返回的结果,ELSE 子句是可选的,用于在所有 WHEN 条件不满足时返回的结果。
2. SQL CASE 表达式的应用场景
SQL CASE 表达式可用于多种应用场景中,如以下几种:
2.1 按条件替换值
SQL CASE 表达式可用于根据条件替换某个字段的值,如下面的示例是一个按订单状态替换状态名称的查询:
SELECT order_id, CASE
WHEN status = 1 THEN '已下单'
WHEN status = 2 THEN '已派单'
WHEN status = 3 THEN '已发货'
ELSE '已关闭'
END AS status_name
FROM orders
示例中,当 orders 表中的 status 字段值为 1 时,返回值为“已下单”,当 status=2 时返回值为“已派单”,以此类推。
2.2 按条件分类统计
SQL CASE 表达式可用于按条件对数据进行分类统计,如下面的示例是一个按地区分组统计订单数量的查询:
SELECT
CASE
WHEN province IN ('北京', '上海', '天津') THEN '直辖市'
WHEN province IN ('广东', '江苏', '浙江', '山东') THEN '东部'
WHEN province IN ('河南', '湖北', '湖南') THEN '中部'
WHEN province IN ('四川', '陕西', '重庆') THEN '西部'
ELSE '其他'
END AS region,
COUNT(*) AS order_count
FROM orders
GROUP BY region
示例中,根据 orders 表中的 province 字段值,将不同的地区归为“直辖市”、“东部”、“中部”、“西部”和“其他”五类,然后按照 region 字段进行统计,返回不同地区订单的数量。
2.3 按条件排序
SQL CASE 表达式可用于根据条件对数据进行排序,如下面的示例是一个按订单状态排序的查询:
SELECT order_id, order_no, status
FROM orders
ORDER BY
CASE
WHEN status = 1 THEN 1
WHEN status = 2 THEN 2
WHEN status = 3 THEN 3
ELSE 4
END
示例中,根据 orders 表中的 status 字段值将不同状态的订单归为“已下单”、“已派单”、“已发货”和“已关闭”四类,然后按照归类后的顺序进行排序。
3. SQL CASE 表达式的注意事项
在使用 SQL CASE 表达式时,还需要注意以下几点:
3.1 CASE 表达式的返回值类型
CASE 表达式的返回值类型与 THEN 子句返回值类型一致,如果 THEN 子句返回的值类型不同,SQL 数据库可能会根据规则自动转换类型。因此,建议THEN 子句返回的值类型一致。
3.2 CASE 表达式的嵌套
CASE 表达式还可以进行嵌套,用于处理更复杂的业务场景。例如,根据订单状态和发货时间统计“按期发货”、“提前发货”和“延期发货”订单数量的查询:
SELECT
CASE
WHEN status = 3 AND delivery_time <= DATEADD(day, 1, expect_delivery_time) THEN '按期发货'
WHEN status = 3 AND delivery_time < expect_delivery_time THEN '提前发货'
WHEN status IN (2,3) AND delivery_time > expect_delivery_time THEN '延期发货'
ELSE '其他'
END AS delivery_status,
COUNT(*) AS order_count
FROM orders
GROUP BY delivery_status
示例中,将 orders 表中按状态归类后,根据发货时间和预计发货时间计算出不同的发货状态 delivery_status,再按照发货状态进行分组统计。
3.3 多个 CASE 表达式组合使用
有些查询可能需要多个 CASE 表达式组合使用,如下面的示例是一个根据日期分类统计销售额的查询:
SELECT
SUM(CASE WHEN order_date BETWEEN '2021-01-01' AND '2021-01-31' THEN total_price ELSE 0 END) AS '1月销售额',
SUM(CASE WHEN order_date BETWEEN '2021-02-01' AND '2021-02-28' THEN total_price ELSE 0 END) AS '2月销售额',
SUM(CASE WHEN order_date BETWEEN '2021-03-01' AND '2021-03-31' THEN total_price ELSE 0 END) AS '3月销售额',
...
FROM orders
示例中,将 orders 表按月份归类后,再根据 order_date 字段将不同时间范围内的销售额分别统计,得到每个月的销售额。
4. 总结
SQL CASE 表达式是一种十分灵活实用的条件表达式,可用于多种业务场景中。在使用 CASE 表达式时,还需要注意返回值类型、嵌套使用和多个表达式组合等问题。