case 函数语法与使用

case 函数是聚合函数的一种,为统计函数。

case表达式:

CASE  selector
   WHEN value1 THEN action1;
   WHEN value2 THEN action2;
   WHEN value3 THEN action3


一、CASE WHEN 表达式有两种形式

(1)简单Case函数 

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

 

 (2)Case搜索函数

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

 

 二、CASE WHEN 应用

学生性别统计student表:

image

 

------------查询表中所有的性别

select  ID,
     (case sex 
     when '1' then '男'
     when '2' then '女'   
     ELSE 'null'
     END) AS  '性别',
     province as '省份'
from `student`   ORDER BY `ID` ASC ;

 

查询结果如下:

image

 

-------------查询江苏省与浙江省男生与女生个数分别是多少。

image

第一种计算方法:以省份区分

select province AS '江苏省',
COUNT(case sex 
              when '男' THEN  '男' 
              ELSE  null END ) AS  '男生',
COUNT(case sex 
              when '女' THEN  '女' 
              ELSE  null END ) AS  '女生'
from `student`  where `province` ='江苏'

UNION 

select province AS '江苏省',
COUNT(case sex 
              when '男' THEN  '男' 
              ELSE  null END ) AS  '男生',
COUNT(case sex 
              when '女' THEN  '女' 
              ELSE  null END ) AS  '女生'
from `student`  where `province` ='浙江'

 

查询结果如下:

image

 

第二种计算:以性别区分

select sex,
        COUNT(case province
              when '江苏' THEN  '江苏' 
              ELSE  null END ) AS  '江苏省',

        COUNT(case province 
              when '浙江' THEN  '浙江' 
              ELSE  null END ) AS  '浙江省'
from  `student` group by  `sex` ;

 

查询结果如下:

image     

注意:

COUNT(case province
              when '江苏' THEN  '江苏'
              ELSE  null END ) AS  '江苏省',

可以简写成:

COUNT( case province  when '江苏' THEN  '江苏'    END ) AS  '江苏省'

 

----------查询各省份的男女数量

select province ,
           sex,
            COUNT(*) AS  '总数'
from `student` GROUP BY province ,sex

 

查询结果如下:

image

 

----------只统计了浙江省的男女数目

select 
     sex ,
     province, 
     count(case province when '江苏' then '江苏' end )as '数量' 
from student group by province, sex;

 

查询结果如下:

image

当数据较多时,使用以上数据查询占用大量的资源,因此可以简单写成以下形式:

select 
     sex as '性别' ,
     count(case province when '江苏' then '江苏' end )as '浙江省' 
from student group by sex;

 

查询结果如下:

image

 

补充:

(1)

select (case province

             when '浙江' then '浙江' 

             when '江苏' then '江苏' 

             else province end  ) as 省份 from student;

 

else province 默认为除浙江、江苏 外显示其他城市

image

(2) case when  可以跟不相等的判断。

          可用于=,>=,<,<=,<>,is null,is not null 等的判断。

如:

image

 

三、CASE WHEN 与 DECODE 比较

1,DECODE  Oracle 特有;
2,CASE WHEN  Oracle ,  SQL Server,  MySQL 都可用;
3,DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断,

       CASE  可用于=,>=,<,<=,<>,is null,is not null 等的判断;

4,DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活;

posted @ 2017-02-04 17:46  风和日丽2010  阅读(2255)  评论(0编辑  收藏  举报