SQL case...end总结

Case具有两种格式----简单Case****函数Case搜索函数

一. 简单Case函数

类似switch…case

CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END

二. Case搜索函数

类似 if…else

CASE 
WHEN sex = '1' THEN '男' 
WHEN sex = '2' THEN '女' 
ELSE '其他' 
END

三.实际应用

3.1 已知数据按照另外一种方式进行分组,分析

国家 人口
中国 2000
日本 500
美国 2000
法国 800

上表,按各大洲进行统计,如何解决?

1.生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。
2.采用case…end

SELECT  SUM(population), 
CASE country  WHEN '中国' THEN '亚洲' 
         	  WHEN '日本' THEN '亚洲' 
  			  WHEN '美国' THEN '北美洲' 
			  ELSE '其他' END 
FROM   xxxxx
GROUP BY
CASE country 
WHEN '中国' THEN '亚洲' 
WHEN '日本' THEN '亚洲' 
WHEN '美国' THEN '北美洲' 
ELSE '其他' END; 

3.2 用一个SQL语句完成不同条件的分组。

国家 性别 人数
中国 1 50
日本 1 12
美国 1 234
中国 2 150
日本 2 120
美国 2 235

上表,统计各个国家的性比人数,怎么实现?
1.用UNION也可以实现用一条语句进行查询。
但是那样增加消耗(两个Select部分),而且SQL语句会比较长;
2.用Case函数来完成

SELECT country, 
SUM( CASE 
WHEN sex = '1' THEN  population
 ELSE 0 END),  --男性人口 
SUM( CASE 
WHEN sex = '2' THEN  population 
ELSE 0 END)   --女性人口
FROM  xxx   GROUP BY country;

3.3 在Check中使用Case函数。

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

例如:
公司A,这个公司有个规定,女职员的工资必须高于1000块。
采用check…case可以在需要的时候添加男职员的要求。

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

3.4 根据条件有选择的UPDATE

例如
有如下更新条件
工资5000以上的职员,工资减少10%
工资在2000到4600之间的职员,工资增加15%

如何解决?
1.采用2次update,有问题,因为工资区间较近,所以最好同时进行
2.采用case…end

UPDATE xxx
SET salary =
CASE WHEN salary >= 5000                   THEN salary * 0.9 
     WHEN salary >= 2000 AND salary < 4600  THEN salary * 1.15 
ELSE salary END;

注意:

最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll。在Case函数中Else部分的默认值是NULL。

3.5 两个表数据是否一致的检查

在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。

3.6 在Case函数中使用合计函数

学号(std_id) 课程(class_id) 课程名称(class_name) 主修(main_class_flg)
100 1 通原 y
200 2 最优化 y
300 3 电磁场 n
400 4 DSP y
SELECT std_id, MAX(class_id) AS main_class  
FROM Studentclass  
GROUP BY std_id  HAVING COUNT(*) = 1;

SELECT std_id, class_id AS main_class  
FROM Studentclass 
WHERE main_class_flg = 'Y' 

使用case整合后

SELECT  std_id, 
CASE
WHEN COUNT(*) = 1   THEN MAX(class_id) 
ELSE  MAX(CASE WHEN main_class_flg = 'Y'  THEN class_id  
               ELSE END  ) 
END AS main_class 
FROM Studentclass  GROUP BY std_id; 

3.7 小结

一是在显示查询结果时可以灵活的组织格式;
二是有效避免了多次对同一个表或几个表的访问。

摘自
http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html

猜你喜欢

转载自blog.csdn.net/weixin_44588186/article/details/86586340