2020-11-11 oracle sql case when流程控制

oracle sql case when 用法

sql语句中 case有两种用法,简单case函数和case 搜索函数
假设现在存在一个表users,包含以下字段
			用户编号( id varchar2(30) , )
			用户姓名 (name  varchar2(100) ,)
			用户年龄 (age  number,)
			用户性别 (sex number , ) 男:1   , 女:0
			用户部门(dept varchar2(20) ,)分为 a,b,c,d四个小部门,a、b属于大部门一部,c、d属于二部。

表数据如图所示
在这里插入图片描述

  • 简单case函数

通过判断值来返回不同的结果,类似翻译值的效果,与decode函数类似。

需要查出用户的性别,返回男女。
select id,name,case sex when 1 then '男' when 0 then '女' else '未知性别' end as sex from users
查询结果如图
在这里插入图片描述

  • case搜索函数

可以在 when后面接各种复杂的条件判断,不会只判断一个值,这样实现流程控制的功能。也可以实现分段、分类的功能。
语法 : case when 条件1 then 结果1 when 条件2 then 结果2 ...... else then 结果* end
写sql的时候不要忘记end

需要查出用户信息以及他们所属的大部门(a、b属于一部,c、d属于二部)
select id,name,case when dept='a' or dept='b' then '一部' when dept='c' or dept='d' then '二部' end as dept from users
查询结果如图
在这里插入图片描述
case 搜索函数还可以在where 条件语句中添加判断条件
比如想要查出a部门的男生和b部门的女生用户信息
select id,name,sex,age,dept from users where (case when dept='a' and sex=1 then 'yes' when dept ='b' and sex=0 then 'yes' end)='yes'
使用正常的where条件实现sql如下
select id,name,sex,age,dept from users where (dept='a' and sex=1) or (dept ='b' and sex=0)
查询数据如下图
在这里插入图片描述

使用case when 需要注意

他和编程语言中if else if的条件判断类似,当进入一个条件之后,不会在进入其他的判断条件。所以如果需要判断的条件之间有交集并且还需要把每个分类的都显示全。就需要查询多次,将结果使用 union进行连接

例如 如果把 a部门的男生划分成 X 类,把b部门的女生划分成Y类 把不是a部门的男生划分成Z类,现在想查出XYZ分类的人员信息。
此时Y类就与Z类就有了交集,case when 如果进了Y类的条件,就不会再去判断Z类,此时就可以使用union来连接多个查询记录了。
select * from( select id,name,dept,sex,
case
when dept='a' and sex=1 then 'X'
when dept!='a' and sex=1 then 'Z'
end as type
from users
union
select id,name,dept,sex,
case when dept='b' and sex='' then 'Y' end as type from users ) where type is not null

使用union连接多个查询结果就可以处理分类之间有交集就不能查出分类所有数据的情况了。本文举的例子可能有的用 case when并不是最合适的方式,主要是为了应用练习,重点在学会使用case when,不在于用在例子中使用这种查询语句是不是最简单 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值