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/