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语句完成不同条件的分组。

国家性别人数
中国150
日本112
美国1234
中国2150
日本2120
美国2235

上表,统计各个国家的性比人数,怎么实现?
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)
1001通原y
2002最优化y
3003电磁场n
4004DSPy
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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值