Oracle中case when的用法

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 | otherweb

上述只是简单的用法,有定义能够看出,有两点须要注意
1.result表示关联条件为真时返回的值,因此不管有多少个when子句,其result都必须的同一个类型的值,由于一个关系型数据库字段只能有一种类型(含括else可能返回的结果)
2.condition “若是为false,则以相同的方式评估后续where子句”即若是为真,就按照这种方式返回结果result,至关与是有前后顺序的数据库

例如 验证2:判断电话134********(以134开头)的号码归属运营商
select case when substr('134********',1,4) = '1349' then '电信' else '移动' endoracle

由号段可知,以1349开头的电话号码为电信,可是134开头号码的移动,因此不能单纯的截取3位来判断,这就是先判断前四位,再判断前三位。利用了case when的前后顺序。svg

拓展:判断号码归属地:
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
code