SQL的case when then else end语句的用法

case具有两种格式。简单case函数和case搜索函数。

SQL的case when then else end语句的用法

这两种方式,可以实现相同的功能。简单情况下函数的写法相对比较简洁,但是和壳体搜索函数相比,功能方面会有些限制,比如写判定式。 

还有一个需要注重的问题,情况下函数只返回第一个符合条件的值,剩下的情况下,部分将会被自动忽略。

SQL的case when then else end语句的用法


一,已知数据按照另外一种方式进行分组,分析。(分组函数+case函数)

如有以下数据

国家

人口

中国

600

美国

100

加拿大

100

英国

200

法国

300

日本

250

德国

200

墨西哥

50

印度

250

统计亚洲和北美洲的人口数量,怎么求?

通过案例函数,SQL如下

SQL的case when then else end语句的用法SQL的case when then else end语句的用法SQL的case when then else end语句的用法

原理:我们要统计每个洲的人数,首先要将国家按洲来分组,中国,日本,印度是亚洲,美国,加拿大,墨西哥是美洲,实现分组后,通过求和聚合函数就能查出每个洲多少人

但是呢!没有洲名明显不能满足我们的要求,那怎么才能加上洲名呢?受分组函数的限制,select后面加列只能是聚合函数和被分组的列,此处被分组的列为country,那我们能直接用country吗?当然不能,因为country这个列的原本的分组逻辑已经改变了,而如果要查询这个列就得用被修改后的分组逻辑来查

SQL的case when then else end语句的用法


人口

亚洲

1100

北美洲

250

其他

700

例2:

姓名

工资

小王

800

小张

450

小陈

100

小明

250

小赵

300

小李

650

小沈

500

小孙

50

小唐

700

其中我们根据工资分为4个等0~200等级1 200~400等级2 400~600等级3 600~800等级4

select 
    count(*) as count
    case when salary>=0 and salary<200 then '等级1'
    when  salary>=200 and salary<400 then '等级2'
    when  salary>=400 and salary<600 then '等级3'
    when  salary>=600 and salary<=800 then '等级4'
    else null end as Grade 
from Payroll group by 
    case when salary>=0 and salary<200 then '等级1'
    when  salary>=200 and salary<400 then '等级2'
    when  salary>=400 and salary<600 then '等级3'
    when  salary>=600 and salary<=800 then '等级4'

    else null end;

count grade
2 等级1
2 等级2
2 等级3
3 等级4


二,用一个sql语句完成不同条件的分组

有如下数据

国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60

需求:按照国家和性别进行分组

国家

思路:以country分组,显示的列为country和对应的聚合函数,那聚合函数怎么构造出'男'和'女'列呢?

很简单,对分组后的sex列做判断,如果sex=1,表示为男,此时统计男性总数,sex=2,表示为女,统计女性总数

SELECT country,
       -- 原理:分组后,是对组进行操作,第二列的意思就是取此组中,sex=1的记录的population的总和
       
SUM( CASE WHEN sex = '1' THEN 
                      population ELSE 0 END) as 男,  
       
SUM( CASE WHEN sex = '2' THEN 
                      population ELSE 0 END) as 女   
FROM
  sex_count

GROUP BY country;

SQL的case when then else end语句的用法


三,check中使用case函数

扩展:check约束用于限制列中值的取值范围

SQL的case when then else end语句的用法

需求:插入的女职工记录条中的工资必须大于1000

create table sex_salary(
      name varchar(24),
      sex number,
      salary number,
     
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = 2
                  THEN CASE WHEN price > 1000 THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

)

如果单纯使用check,但是这样的话,女职员的条件可以符合,但男职员就无法输入了

CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )