SQL语法-CASE用法

时间:2025-04-08 19:27:33

CASE基础语法

1. 单个条件 :

比如,根据学生考试分数的不同,来判断成绩是及格还是优良。

CASE 列名 WHEN 条件 THEN 结果 ELSE 其他结果 END 别名
# 简单CASE WHEN
CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END 
CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END
CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END

2. 多个条件—— 单列判断:

就是把上面描述的多个条件合并。 是根据一列内容的不同程度,去划分不同结果。 因为都是针对同一列数据进行判断,这里就可以在case 后面指定列名:CASE 列名 WHEN...

CASE 列名 
     WHEN 条件1 THEN 结果1
	WHEN 条件2 THEN 结果2
	...
	ELSE 其他结果 END 别名
FROM 表格名
# 合并多个条件
case SCORE                                             
	when 'A' then '优'
    when 'B' then '良'
    when 'C' then '中'
    else '不及格' end 成绩
from score_table;

3. 多个条件—— 多列比较判断:

第三种就复杂一点,可能涉及多列数据的相互比较,多个条件的综合判断。语法是 CASE WHEN 条件 THEN 结果 ElSE 结果2

CASE  
     WHEN 条件1 THEN 结果1
	WHEN 条件2 THEN 结果2
	...
	ELSE 其他结果 END 别名
FROM 表格名
# 多条件比较
SELECT x,y,z,
    CASE
        WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
        ELSE 'No'
    END AS 'triangle'
FROM triangle;

CASE WHEN 题目

1)按条件分类-树节点

问题:给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。

表格tree:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+

要求输出表格:
+----+------+
| id | Type |
+----+------+
| 1  | Root |
| 2  | Inner|
| 3  | Leaf |
| 4  | Leaf |
| 5  | Leaf |
+----+------+

答案代码:
select id,
case when p_id is null then 'Root'
when id in (select p_id from tree) then 'Inner'
else 'Leaf' end type
from tree

2)多列比较-三角形

问题:假设表 triangle 保存了所有三条线段的三元组 x, y, z ,你能帮 Tim 写一个查询语句,来判断每个三元组是否可以组成一个三角形吗?

| x  | y  | z  |
|----|----|----|
| 13 | 15 | 30 |
| 10 | 20 | 15 |

注:任意两边之和 大于 第三边

解法一:
SELECT x,y,z,
    CASE
        WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
        ELSE 'No'
    END AS 'triangle'
FROM triangle;

解法二(使用IF):
SELECT
	*, IF(`x` + `y` > `z` AND `x` + `z` > `y` AND `y` + `z` > `x`, 'Yes', 'No') AS triangle
FROM
	triangle;

3) 按条件统计 SUM(case())

问题:现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。
表结构如下:其中STU_SEX字段,0表示男生,1表示女生。

STU_CODE	STU_NAME	STU_SEX	STU_SCORE
XM	小明	0	88
XL	小磊	0	55
XF	小峰	0	45
XH	小红	1	66
XN	晓妮	1	77
XY	小伊	1	99

解法:
SELECT 
	SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
	SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM THTF_STUDENTS

输出结果如下:

MALE_COUNT FEMALE_COUNT MALE_PASS FEMALE_PASS
3 3 1 3

4)行转列

有能耗表如下:其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗

E_CODE	E_VALUE 	E_TYPE
北京	28.50	0
北京	23.51	1
北京	28.12	2
北京	12.30	0
北京	15.46	1
上海	18.88	0
上海	16.66	1
上海	19.99	0
上海	10.05	0


SELECT 
	E_CODE,
	SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
	SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗
	SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗
FROM THTF_ENERGY_TEST
GROUP BY E_CODE

结果输出:

E_CODE WATER_ENERGY ELE_ENERGY HEAT_ENERGY
北京 40.80 38.97 28.12
上海 48.92 16.66 0

链接:/problems/triangle-judgement/solution/pan-duan-san-jiao-xing-by-leetcode/
链接:/problems/triangle-judgement/solution/610-pan-duan-san-jiao-xing-by-eric-345/