1. 程式人生 > >Oracle中case when的用法

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