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进阶教程》

猜你喜欢

转载自blog.csdn.net/qq_38869560/article/details/129914569