赞
踩
Oracle中case when的用法
case when 表达式是一个通用条件的表达式,可以在表达式有效的任何位置使用。
用法如下:
CASE
WHEN condition THEN result
[ WHEN condition THEN result ]
…
[ ELSE result ]
END
condition:返回一个布尔结果的表达式。如果结果为false,则以相同的方式评估后续where子句。
result :当关联条件为真时要返回的值
ELSE result:如果没有条件,则CASE表达式的值是ELSE子句中的结果。 如果省略ELSE子句且没有条件匹配,则结果为null。
例如:
SELECT a, CASE WHEN a=1 THEN ‘one’
WHEN a=2 THEN ‘two’
ELSE ‘other’ END
FROM test;
结果如下:
a | case
—+——-
1 | one
2 | two
3 | other
上述只是简单的用法,有定义可以看出,有两点需要注意
1.result表示关联条件为真时返回的值,所以无论有多少个when子句,其result都必须的同一个类型的值,因为一个关系型数据库字段只能有一种类型(含括else可能返回的结果)
2.condition “如果为false,则以相同的方式评估后续where子句”即如果为真,就按照这种方式返回结果result,相当与是有先后顺序的
例如 验证2:判断电话134********(以134开头)的号码归属运营商
select case when substr(‘134********’,1,4) = ‘1349’ then ‘电信’ else ‘移动’ end
由号段可知,以1349开头的电话号码为电信,但是134开头号码的移动,所以不能单纯的截取3位来判断,这就是先判断前四位,再判断前三位。利用了case when的先后顺序。
拓展:判断号码归属地:
select case when substr(a.tel,1,4) in (‘1703’,‘1705’,‘1706’,‘1440’) then ‘移动’
when substr(a.tel,1,4) in (‘1704’,‘1707’,‘1708’,‘1709’) then ‘联通’
when substr(a.tel,1,4) in (‘1410’,‘1700’,‘1701’,‘1702’,‘1349’) then ‘电信’
when substr(a.tel,1,3)(‘134’,‘135’,‘136’,‘137’,‘138’,‘139’,‘150’,‘151’,‘152’,‘157’,‘158’,‘159’,‘182’,‘183’,‘184’,‘187’,‘188’,‘178’,‘147’,‘198’,‘148’) then ‘移动’
when substr(a.tel,1,3) in (‘130’,‘131’,‘132’,‘155’,‘156’,‘185’,‘186’,‘176’,‘145’,‘171’,‘166’,‘146’) then ‘联通’
when substr(a.tel,1,3) in (‘133’,‘153’,‘189’,‘180’,‘181’,‘177’,‘173’,‘149’,‘199’) then ‘电信’
end as operator_type
from tb_tel a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。