對於CASE與DECODE其實並沒有太多的區別,他們都是用來實現邏輯判斷。Oracle的DECODE函數功能很強,靈活運用的話可以避免多次掃描,從而提高查詢的性能。而CASE是9i以后提供的語法,這個語法更加的靈活,提供了IF THEN ELSE的功能。想要知道他們具體的用法,我們先來看看他們的語法:
CASE表達式語法:
CASE還有另外一種語法:
DECODE語法就相對簡單的多,DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等於if1時,DECODE函數的結果返then1,...,如果不等於任何一個if值,則返回else。可以用函數或表達式來替代value,if,then,else從而作出一些更有用的比較。
從上面的語法可以看出CASE的語法一與DECODE更多的是用於等值判斷,可以這么說decode只能做等值的,case
我們可以通過以下的例子來具體的了解他們的用法
上面兩個是用CASE的兩種語法來實現的,這種等值的比較,我們也可以用DECODE來實現,但需要注意的是DECODE必須用在SQL語句中
這三個均實現的都是向前台輸出c。可以看出decode像是case when的精簡版,當要實現的功能比較簡單時,用decode方便,簡潔.當decode滿足不了的時候我們可以用case來解決問題。就像不等值的比較
對於上面的例子依然輸出c,i是進行的不等值比較,需要使用的case表達式,不然則需要使用sign()配合使用。對於上面的CASE語句,需要說明一點
這時輸出的是a,那是因為CASE語句尋找when的優先級是從上到下。再多的when,也只有一個出口,即其中有一個滿足了expr就馬上退出case,這點需要牢記。
在此需要說明一點decode是oracle獨有的, case when是標准SQL的語法,mysql等其他版本數據庫中都可以使用。
實際情況中,我們經常會遇到縱表橫表相互轉化的問題,這時就需要用到DECODE函數來實現的,具體實現的方法,我們下次再說。