Oracle CASE WHEN函数用法

一、CASE函数有两种格式:1.简单CASE函数。2.CASE搜索函数。

--简单Case函数
CASE sex
WHEN '1' THEN ''
WHEN '2' THEN ''
ELSE '其他' END

 

--Case搜索函数 
CASE WHEN sex = '1' THEN '' 
WHEN sex = '2' THEN '' 
ELSE '其他' END  

两种方式可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

--下面这段SQL,你永远无法得到“第二类”这个结果 
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类' 
WHEN col_1 IN ('a')  THEN '第二类' 
ELSE'其他' END

 

 

二、用法实例

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; 

 

2.与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  

原始表:

结果表:

 

 

 

3.与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; 

 

posted @ 2020-06-08 03:04  Mingo丶  阅读(1877)  评论(0)    收藏  举报