case when 在不同條件需要有不同返回值的情況下使用非常方便,可以在給變量賦值時使用,也可以在select查詢語句中使用
(有一個滿足,就立刻退出)
--搜索格式,case後無內容
str:=case
when i=1 then 'a'
when i=2 then 'b'
else 'c'
end; --此處賦值,爲表達,不用end case。若不賦值給str,則需要用end case。
--表達語句格式。需要的變量放在case後,而不是when中
case var
when 1 then 'a'
when 2 then 'b'
else 'c'
end;
注:搜索中when後是條件,表達中when後是值。中間無分號,是一整條連寫
(表達格式與decode類似,即各個以值來進行區分)
decode(var,1,'a',2,'b','c')
--select中使用
select case i when 1 then 'a'
when 2 then 'b'
when 3 then 'c'
else 'd'
end case from table1;
case when和decode可以用來做列轉行轉換
select Name,
sum(decode(Course, '語文', Grade, 0)) 語文,
sum(decode(Course, '數學', Grade, 0)) 數學,
sum(decode(Course, '英語', Grade, 0)) 英語
from S
group by Name;
-------------
end與end case:在end後加與不加case
在表達式中要使用“end”,而在PL/SQL過程判斷中需要使用“end case”。
-------------------------
比較:
case 表達式
decode 函數
decode可避免多次掃描,提高性能;case爲9i以後用法,提供if then else功能
用decode可以違反第3NF(行不可再分,列不可再分,列不可重複):列重複
兩個基本差不多,只是在性能上稍微有些差別,以及寫法上的簡潔性。
Oracle在文檔中提到CASE語句的效率會更高一些,尤其是CASE表達式 WHEN 常量 THEN的語法,效率要比CASE WHEN表達式 THEN的語法更高一些。