SQL—— CASE 表达式

CASE 表达式

-- 简单CASE表达式
CASE sex
	WHEN '1' THEN '男'
	WHEN '0' THEN '女'
ELSE '武装直升机' END

-- 搜索CASE表达式
CASE WHEN sex = '1' THEN '男'
	 WHEN sex = '0' THEN '女'
ELSE '武装直升机' END

注意:

  1. 各分支返回统一的数据类型
  2. 不要忘记写 END
  3. 养成写 ELSE 语句的习惯

应用

数据重分组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fihu0I9j-1680430149963)(C:\Users\ZYM\AppData\Roaming\Typora\typora-user-images\image-20230402174343326.png)]

-- 把区编号转换成地区编号
SELECT CASE pref_name
				WHEN '德岛' THEN '四国'
				WHEN '香川' THEN '四国'
				WHEN '爱媛' THEN '四国'
				WHEN '高知' THEN '四国'
				WHEN '福冈' THEN '九州'
				WHEN '佐贺' THEN '九州'
				WHEN '长崎' THEN '九州'
		ELSE '其他' END AS 地区名,
		SUM(population)
  FROM PopTbl
 GROUP BY CASE pref_name
				WHEN '德岛' THEN '四国'
				WHEN '香川' THEN '四国'
				WHEN '爱媛' THEN '四国'
				WHEN '高知' THEN '四国'
				WHEN '福冈' THEN '九州'
				WHEN '佐贺' THEN '九州'
				WHEN '长崎' THEN '九州'
		ELSE '其他' END;			

行列转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eb83oFML-1680430149965)(C:\Users\ZYM\AppData\Roaming\Typora\typora-user-images\image-20230402174423323.png)]

SELECT pref_name,
		-- 男性人口
		SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
		-- 女性人口
		SUM( CASE THEN sex = '0' THEN population ELSE 0 END) AS cnt_f
	FROM PopTbl2
   GROUP BY pref_name;

结合CHECK约束

某公司规定“女性员工的工资必须在 20 万日元以下

​ 蕴含式 P → Q P \rightarrow Q PQ

CONSTRAINT check_salary CHECK
			( CASE WHEN sex = '2'
            		THEN CASE WHEN salary <= 200000
            					THEN 1 ELSE 0 END)
            		ELSE 1 END = 1 )

​ 注意对比 逻辑与 P ^ Q

CONSTRAINT check_salary CHECK
			( SEX = '2' AND salary <= 200000)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1vngjYV-1680430149965)(C:\Users\ZYM\AppData\Roaming\Typora\typora-user-images\image-20230402174453923.png)]

UPDATE 语句使用条件分支

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XWE3AUW-1680430149966)(C:\Users\ZYM\AppData\Roaming\Typora\typora-user-images\image-20230402180544414.png)]

UPDATE Salaries
	SET salary = CASE WHEN salary >= 300000
					  THEN salary * 0.9
					  WHEN salary >= 250000 AND salary < 280000
					  THEN salary * 1.2
					  ELSE salary END;

表间数据匹配

在这里插入图片描述

-- 表匹配: 使用IN谓词
SELECT course_name,
		CASE WHEN course_id IN
				(SELECT course_id FROM OpenCourses
                	WHEN month = 200706) THEN 'O'
              ELSE 'X' END AS '六月',
        ...
   FROM CourseMaster;

-- 表匹配: 使用EXIST谓词
SELECT course_name,
		CASE WHEN EXIST
				(SELECT course_id FROM OpenCourses OC
                	WHEN month = 200706 AND CM.course_id = OC.course_id) THEN 'O'
              ELSE 'X' END AS '六月',
        ...
   FROM CourseMaster CM;

CASE中使用聚合函数

获取只加入一个社团的学生的社团 ID 和 加入多个社团的学生的主社团 ID。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-399fDvoV-1680430149966)(C:\Users\ZYM\AppData\Roaming\Typora\typora-user-images\image-20230402180618437.png)]

SELECT std_id,
		CASE WHEN COUNT(*) = 1
			 THEN MAX(club_id)
			 ELSE MAX(CASE WHEN main_club_flg = 'Y'
                     		THEN club_id
                     		ELSE NULL END)
        END AS main_club
  FROM StuedentClub
 GROUP BY std_id;

《SQL进阶教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值