有时候我们会遇到这样的场景,就像java或者c++语句,
if (A == "helllo" ){
//do something
}
对于基本的SQL语句,上面的写法是支持的。下面笔者会介绍基本用法,或者一些比较常见的高级用法,方面自己或者读者在遇到此类场景时,快速找到入口,想起此类SQL语句如何写。
基本用法如下:
case x when y then z else m end
如果 x 字段满足 y条件时,做 z
不满足时,做m
举个例子:表里面只有学生姓名,科目,分数 3个字段,我现在需要生成第4个字段,级别。比如说分数大于90为A
以前 : student(姓名, 科目, 分数) == student(studName, stuSubject, stuScore)
期望:student(姓名, 科目, 分数,级别) == student(studName, stuSubject, stuScore, stuLevel)
写法为:
slect studName
stuSubject
stuScore
case stuScore when stuScore > '90' then 'A' else "B" end AS stuLevel
from student
该写法可以自然的扩展到不同分数级别上。(AS stuLevel 这里取了一个列头)
也可以简化成下面这个写法(不用 语法中的 x):
slect studName
stuSubject
stuScore
case when stuScore > '90' then 'A' else "B" end AS stuLevel
from student
CASE
WHEN 条件1 THEN 选项1
WHEN 条件2 THEN 选项2
……
ELSE 默认值
END
如:
CASE
WHEN score>=90 THEN 'A'
WHEN score>=80 THEN 'B'
WHEN score>=70 THEN 'C'
ELSE 'D' END
(表达的是当score>=90时返回A,A可以代表等级。score>=80返回B,这里隐含的完整条件是90>score>=80,当score>=70时返回C,其他的都返回D。)
里面也可以加逻辑运算:如 OR|AND
CASE
WHEN name = '小明' OR name = '小王' THEN '1班'
ELSE '2班' END AS CLASS
SELECT COUNTRY,
SUM(CASE SEX WHEN '1' THEN POPULATION ELSE 0 END) AS '男',
SUM(CASE SEX WHEN '2' THEN PUPULATION ELSE 0 END) AS '女'
FORM TABLE_A GROUP BY COUNTRY;
使用SUM时,不需要和GROUP BY 一起使用。
SELECT COUNTRY,
MAX(CASE SEX WHEN '1' THEN POPULATION ELSE 0 END) AS '男',
MAX(CASE SEX WHEN '2' THEN PUPULATION ELSE 0 END) AS '女'
FORM TABLE_A GROUP BY COUNTRY;
使用MAX时,需要和GROUP BY 一起使用。
按照分数等级,统计不同等级人数。
可以直接在维度列直接使用case when将分数转换为等级,
然后group by操作时也是用同样的case when语句来进行聚合,
这时就是按照等级来聚合,计算的逻辑是首先根据分数来确定等级,相同等级的数据进行count聚合。如下:
SELECT
CASE WHEN score>=90 THEN 'A' WHEN score>=80 THEN 'B' WHEN score>=70 THEN 'C' ELSE 'D' END AS grade,
COUNT(name) AS num
FROM student
GROUP BY
CASE WHEN score>=90 THEN 'A' WHEN score>=80 THEN 'B' WHEN score>=70 THEN 'C' ELSE 'D' END
统计B等级的人数:
SELECT COUNT(`name`) AS B
FROM student
WHERE score>=80 AND score<90
用case when来统计:
SELECT
COUNT(CASE WHEN score>=80 AND score<90 THEN `name` ELSE NULL END) AS B
FROM studentSQL语句case when基本用法