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,不在于用在例子中使用这种查询语句是不是最简单 。