SQL语句case when基本用法介绍

背景介绍

有时候我们会遇到这样的场景,就像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

集函数一起使用

示例1-SUM

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 一起使用。

示例2-MAX

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 一起使用。

示例3-GOUP 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

CASE WHEN和WHERE的关系

统计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基本用法

猜你喜欢

转载自blog.csdn.net/qq_39463175/article/details/131523830