CASE WHEN 表达式在 SQL 查询中有许多高级使用方式,下面列出了一些常见的高级用法:
1. 多条件判断:CASE WHEN 表达式可以根据多个条件进行判断。可以使用多个 WHEN 子句来定义不同的条件,并在 ELSE 子句中提供默认值。例如:
SELECT column,
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END AS alias
FROM table;
2. 嵌套 CASE WHEN:CASE WHEN 表达式可以嵌套在其他 CASE WHEN 表达式内部,形成更复杂的逻辑判断。例如:
SELECT column,
CASE
WHEN condition1 THEN
CASE
WHEN nested_condition1 THEN nested_result1
WHEN nested_condition2 THEN nested_result2
...
ELSE nested_default_result
END
WHEN condition2 THEN result2
...
ELSE default_result
END AS alias
FROM table;
3. 使用聚合函数: CASE WHEN 表达式可以与聚合函数结合使用,根据条件对聚合结果进行分组或筛选。例如:
SELECT column,
SUM(CASE WHEN condition THEN value END) AS sum_condition
FROM table
GROUP BY column;
4. 范围判断: CASE WHEN 表达式可以进行范围判断,而不仅仅是等值判断。例如:
SELECT column,
CASE
WHEN value BETWEEN min_value AND max_value THEN result
ELSE default_result
END AS alias
FROM table;
(1)用case when 来计算男生人数 女生人数
SELECT
COUNT(CASE WHEN s_sex = '男' THEN 1 END) AS 男生人数,
COUNT(CASE WHEN s_sex = '女' THEN 1 END) AS 女生人数
FROM student;
这个查询使用了两个 CASE WHEN 子句,分别计算出符合条件的男生人数和女生人数。COUNT 函数只统计非空值,因此当条件满足时,返回 1,否则返回 NULL。
(2)假设有一个名为 "orders" 的表,其中包含字段 "order_id"(订单ID)和 "order_amount"(订单金额)。计算不同金额范围的订单数量。使用 CASE WHEN 和 COUNT 聚合函数来实现:
SELECT
CASE
WHEN order_amount < 1000 THEN '小额订单'
WHEN order_amount >= 1000 AND order_amount < 5000 THEN '中额订单'
ELSE '大额订单'
END AS 订单类型,
COUNT(*) AS 订单数量
FROM orders
GROUP BY
CASE
WHEN order_amount < 1000 THEN '小额订单'
WHEN order_amount >= 1000 AND order_amount < 5000 THEN '中额订单'
ELSE '大额订单'
END;
在这个查询中,使用 CASE WHEN 表达式根据订单金额将订单分为不同的类型,并在 CASE WHEN 中给出每个类型的名称。然后,使用 COUNT(*) 聚合函数对每个类型的订单数量进行计数。
注意,在 GROUP BY 子句中,再次使用相同的 CASE WHEN 表达式,以确保按订单类型进行正确的分组。
最终,查询结果将包括两列:订单类型和订单数量,显示不同类型的订单数量统计。
(3)用case when求季度
select hire_date,case when to_char(hire_date,'mm') in( 1, 2,3)then 1
when to_char(hire_date,'mm') in( 4,5,6)then 2
when to_char(hire_date,'mm') in( 7,8,9)then 3
when to_char(hire_date,'mm') in( 10,11,12)then 4
end "季度"
from employees;
最有技术含量的求季度方式(通用版)
select hire_date,trunc((to_char(hire_date,'mm')+2)/3)
from employees;
最简单的求季度方法
select to_char(hire_date,'q')
from employees;