1-1 CASE表达式

CASE表达式概述

注意事项 1:一定要注意CASE表达式里各个分支返回的数据类型是否一致。某个分支返回字符型,而其他分支返回数值型的写法是不正确的。 注意事项 2:不要忘了写END。 注意事项 3:养成写ELSE子句的习惯。

~CASE表达式需要特别的注意项。

用一条SQL语句进行不同条件的统计

-- 县市人口表(县名,性别,人口数量)
-- 统计县市中的男性人口与女性人口的数量。
SELECT
	pref_name,       
	-- 男性人口       
	SUM( CASE WHEN sex='1' THEN population ELSE 0 END)AS cnt_m,       
	-- 女性人口       
	SUM( CASE WHEN sex='2' THEN population ELSE 0 END)AS cnt_f  
FROM  PopTbl2
GROUP BY pref_name;

~这种写法还是比较常见,记录在这里当做温习之用。

用CHECK约束定义多个列的条件关系

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

~对于我来说,这是一种新的写法,或者说我从来就没有在数据库上写过约束。

在UPDATE语句里进行条件分支*

-- 用CASE表达式写正确的更新操作
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;
-- 用CASE表达式调换主键值
UPDATE SomeTable   
SET p_key =
	CASE WHEN p_key='a'                    
	THEN 'b'                    
	WHEN p_key='b'                    
	THEN 'a'                    
	ELSE p_key END
WHERE p_key IN('a', 'b');

~非常实用,工作中就能够用的到。

表之间的数据匹配*

CASE表达式的一大优势在于能够判断表达式。也就是说,在CASE表达式里,我们可以使用BETWEEN、LIKE和<、>等便利的谓词组合,以及能嵌套子查询的IN和EXISTS谓词。

-- 表的匹配:使用IN谓词
SELECT
	course_name,       
	CASE WHEN course_id IN                   
			(SELECT course_id FROM OpenCourses                      
				WHERE month=200706)THEN '○'            
		ELSE '×' END AS "6月",       
	CASE WHEN course_id IN                   
				(SELECT course_id FROM OpenCourses                      
				WHERE month=200707)THEN '○'            
			ELSE '×' END AS "7月",       
	CASE WHEN course_id IN                   
			(SELECT course_id FROM OpenCourses                      
			WHERE month=200708)THEN '○'            
		ELSE '×' END AS "8月"  
FROM CourseMaster;
-- 表的匹配:使用EXISTS谓词
SELECT
	CM.course_name,       
	CASE WHEN EXISTS                   
			(SELECT course_id FROM OpenCourses OC
				WHERE month=200706                        
				AND OC.course_id=CM.course_id)THEN '○'            
		ELSE '×' END AS "6月",       
	CASE WHEN EXISTS                   
			(SELECT course_id FROM OpenCourses OC  
				WHERE month=200707                        
				AND OC.course_id=CM.course_id)THEN '○'            
		ELSE '×' END AS "7月",       
	CASE WHEN EXISTS                   
			(SELECT course_id FROM OpenCourses OC                      
				WHERE month=200708                        
				AND OC.course_id=CM.course_id)THEN '○'            
		ELSE '×' END  AS "8月"  
FROM CourseMaster CM;

~我之前不熟悉的写法。

在CASE表达式中使用聚合函数*

-- 学生俱乐部(学号ID,社团ID,社团名,主社团标志)
-- 获取只加入了一个社团的学生的社团ID;获取加入了多个社团的学生的主社团ID。
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 StudentClub
GROUP BY std_id;

~我之前不熟悉的写法。