分为两种
简单表达式:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
搜索表达式(一般都用搜索表达式来写):
CASE WHEN
sex = '1' THEN '男'
sex = '2' THEN '女'
ELSE '其他' END
WHEN 子句要注意排他性
CASE WHEN col1 IN ('a','b') THEN '1'
WHEN col1 = ''b' THEN '2'
ELSE '其他' END
注意事项:
1.分支的返回数据类型一致;
2.不要忘记写END;
3.养成写ELSE子句的习惯。
--市级编号转化为省地区编号(1)
SELET CASE city_name
WHEN '安庆' THEN '安徽'
WHEN '南京' THEN '江苏'
ELSE '其他' END
sum(population)
FROM Tablename
GROUP by CASE city_name
WHEN '安庆' THEN '安徽'
WHEN '南京' THEN '江苏'
ELSE '其他' END;
用一条语句进行不同条件的统计(行转列):
SELECT city_name,
SUM(WHEN sex = '1' THEN population ELSE 0 END) as "男",
SUM(WHEN sex = '2' THEN population ELSE 0 END) as "女"
FROM Tablename
GROUP BY city_name;
新手用 WHERE 子句进行条件分支,高手用 SELECT 子句进行条件分支。
--用CASE WHEN 写正确的更新操作:
UPDATE tableA SET col1 = CASE WHEN col1 >=5
THEN col1\*0.8
WHEN col1 >=3 and col1<5
THEN col1\*1.1
ELSE col1 END;
可以用在修改主键值的场景等等
其他示例--表之间的数据匹配
表A
col1 | col2 |
---|---|
1 | SQL |
2 | PYTHON |
3 | JAVA |
4 | JS |
表B
colA | colB |
---|---|
王五 | 1 |
王五 | 2 |
王五 | 3 |
赵四 | 3 |
赵四 | 4 |
李三 | 2 |
结果表
col2 | 王五 | 赵四 | 李三 |
---|---|---|---|
SQL | O | × | × |
PYTHON | O | × | O |
JAVA | O | O | × |
JS | × | O | × |
SELECT tableA.col2,
CASE WHEN EXISTS (SELECT colB FROM tableB
WHERE colA = '王五'
AND tableA.col1 = tableB.colB ) THNE 'O'
ELSE '×' END as "王五”,
CASE WHEN EXISTS (SELECT colB FROM tableB
WHERE colA = '赵四'
AND tableA.col1 = tableB.colB ) THNE 'O'
ELSE '×' END as "赵四”,
CASE WHEN EXISTS (SELECT colB FROM tableB
WHERE colA = '李三'
AND tableA.col1 = tableB.colB ) THNE 'O'
ELSE '×' END as "李三”
FROM tableA;
HAVING子句写入到SELECT 分支中:
SELECT col1,
CASE WHEN COUNT(1) = 1
TEHN MAX(col1)
ELSE MAX(CASE WHEN col2 = '3'
THEN col1
ELSE NULL END)
END as clo1_new
FROM tableA
GROUP BY col1;
新手用HAVING子句进行条件分支,高手用SELECT子句进行条件分支。
--以上主要摘录自《SQL进阶教程》 MICK 著 吴炎昌 译
网友评论