介紹
介紹case語句的不同的表達式及作用、用法。
分類
在sql中主要有兩種:簡單case和搜尋case,在plsql中還有兩種case 語句,與decode 類似。(有一定的區別)
簡單的case:
語法:case exp when comexp then returnvalue
..when comexp then returnvalue
Else
Returnvalue
End
使用規則case簡介。
Case到end之間相當於一個具體的值,可以做運算,取別名,嵌套case 等等。只要把case到end當作一個運算結果的表達式就可以了。
《注意,中間一直到end 都沒有其他標點符號》
搜尋case:
搜尋case例子
比較操作,可以使用like,between … and ..,!=,<,>=等操作符以及其他返回boolean類型的操作符。
簡單case和searched case之間的區別:
1. 簡單case只能是when後面的表達式完全匹配case後的表達式,相當於 =,所以也不能匹配null。
2. searched case可以作為比較條件,那么可以使用like,!=,between ..and,<,=,is null,is not null等,比簡單case的使用更加廣泛,完全可以替代簡單case。
用法
1.Case 表達式返回的是一個確定的value,如果沒有else,若前面的都不匹配,則返回null。<else 不是必須的,都沒有匹配返回null,這與pl/sql 中的case 語句不同,case 語句如果不寫else,都沒有匹配,則報case_not_found異常>
2.簡單case 中的表達式,when 後面的表達式類型應該全部保持一致。如:
select case 'a' when 'a' then 1 when 9 then 3 end from dual;--所有的when 類型必須與第case之後的表達式值類型保持一致,資料的9應該是’9’,沒有自動轉換成char,和一般的sql中自動轉換不同。
3.所有的then 後面的return_value類型要保持一致
select case 'a' when 'a' then '1' when '9' then '3' else 3 end from dual;--紅色部分類型應該保持一致,沒有自動轉換,else後面的3應該是’3’.
4.對於簡單case 表達式,也就是case 表達式 when…那么when null 總是取不到。也就是case 後面的表達式如果值為null,不會與when null 匹配,只會與else 匹配。如:
select case null when null then 'null' else 'not matched!' end from dual;--case的null不會與when後面的null匹配,只會返回else的結果。
關於這點,如果case 後面的表達式有可能為null,如果需要匹配null,那么可以使用decode 和searched case。
Decode:
decode(exp,
value1,res1,
value2,res2,….,
valuen resn,
elsevalue)。
如果其中有存在exp為null,那么如果valuei中有null,則會匹配,返回resi。如:
select decode(null,'a1','1','a2','2',null,'null','not know!') from dual;--返回字元串null
searched case:
case when
condition_1 then value1
when condition_2 then value2…
when condtion_i then valuei
else
elsevalue
end
如果要匹配null,只需要 case when exp is null then ..就可以了
5.對於searched case來說,有自動類型轉換,只要條件成立就可以。如:select case when 1="1" then 1 end from dual;--1=’1’條件成立
6.參數最高限制255 個。包括case exp 中的exp 和else 中的,以及when exp1 value 1 算兩個參數。如果語句複雜,超過這個限制,可以考慮使用嵌套case。
其它例子
select case (select count(*) as s1 from t1 where a = 1)
when (select count(*) as s2
from t1, t2
where t1.a = t2.a
and t2.a = 1) then
'相等'
else
'不相等'
end
from dual;