CASE WHEN 用法

一、用法

case 
  when sex = '1' then '男'
  when sex = '2' then '女'
else '未知' end

Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
Case when 相当于一个自定义的数据透视表,group by 是行名,case when 负责列名。

二、实例

  1. 与GROUP BY 结合,自定义列联表统计
SELECT country, 
  SUM( CASE WHEN sex = '1' THEN  population ELSE 0 END),  --男性人口 
  SUM( CASE WHEN sex = '2' THEN  population ELSE 0 END)   --女性人口
  FROM  Table_A  GROUP BY country; 
  • 增加分组条件


    增加分组条件.png
  1. 与Group by结合,自定义分组统计
/*新建一个表demo*/
CREATE TABLE demo (
  type varchar(10)  NULL,
  num int NULL)

/*插入数据*/
insert into demo values ('A',10);
insert into demo values ('B',10);
insert into demo values ('C',10);
insert into demo values ('D',10);
insert into demo values ('E',10);
insert into demo values ('F',10);
insert into demo values ('G',10);

/*利用CASE WHEN 和 GROUP BY 实现自定义分组合计*/
select 
  case 
    when type in('A','C','D') THEN 'ACD'
    when type in('F','G') THEN 'FG'
  else type end as types,sum(num)
  from demo
  group by 
  case 
    when type in('A','C','D') THEN 'ACD'
    when type in('F','G') THEN 'FG'
  else type end  
  • 原始表


    原始表.png
  • select 结果


    select结果
  1. 与distinct结合,去重分组统计
select 
  count(distinct case when photo='1'  then id else null end )photo1_count,
  count(distinct case when photo='2'  then id else null end )photo2_count
  from photos

4.根据条件有选择的UPDATE

UPDATE Personnel
SET salary =
CASE 
  WHEN salary >= 5000                   THEN salary * 0.9 
  WHEN salary >= 2000 AND salary < 4600  THEN salary * 1.15 
ELSE salary END; 
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'); 

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

--使用IN的时候 
SELECT keyCol, 
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )  THEN 'Matched' 
ELSE 'Unmatched' END Label 
FROM tbl_A; 
 
--使用EXISTS的时候 
SELECT keyCol, 
CASE WHEN EXISTS ( SELECT * FROM tbl_B  WHERE tbl_A.keyCol = tbl_B.keyCol )  THEN 'Matched'  ELSE 'Unmatched' END Label 
FROM tbl_A; 

参考:用法详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,264评论 0 7
  • ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year:...
    雨一流阅读 694评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 。。。
    kou爺阅读 221评论 0 2
  • 一直答应粥哥为公众号写三篇有关宇宙和人类探索太空的文章,可是却一直也没动笔。主要是因为内容太宽泛,不知道从何入手,...
    老毛zoo阅读 266评论 8 1