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

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


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

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



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

如有以下数据

国家

人口

中国

600

美国

100

加拿大

100

英国

200

法国

300

日本

250

德国

200

墨西哥

50

印度

250

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

通过案例函数,SQL如下


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

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


人口

亚洲

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;

countgrade
2等级1
2等级2
2等级3
3等级4


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

有如下数据

国家(country)性别(sex)人口(population)
中国1340
中国2260
美国145
美国255
加拿大151
加拿大249
英国140
英国260

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

国家

思路:以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;



三,check中使用case函数

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


需求:插入的女职工记录条中的工资必须大于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 )














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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值