【DB筆試面試455】條件表達式CASE和DECODE的區別是什麼?
- 2019 年 10 月 11 日
- 筆記
題目部分
條件表達式CASE和DECODE的區別是什麼?
答案部分
在SQL語句中使用IF-THEN-ELSE邏輯,可以使用兩種方法:CASE表達式、DECODE函數。
1、CASE表達式
SQL中CASE的使用方法具有兩種格式:簡單CASE函數和CASE搜索函數。
簡單CASE函數使用方式如下所示:
CASE SEX WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其它' END AS "類別" CASE搜索函數使用方式如下所示: CASE WHEN SEX = '1' THEN '男' WHEN SEX = '2' THEN '女' ELSE '其它' END AS "類別"
以上兩種方式可以實現相同的功能。簡單CASE函數的寫法相對比較簡潔,但是和CASE搜索函數相比,功能方面會有些限制,例如編寫判斷式,下面的例子無法使用簡單CASE函數來實現:
CASE WHEN SEX = '1' AND AGE>60 THEN '爺爺' WHEN SEX = '2' AND AGE>60 THEN '奶奶' ELSE '其它' END AS "類別"
需要注意的是,CASE函數只返回第一個符合條件的值,剩下的CASE部分將會被自動忽略。例如下面的SQL語句,永遠無法得到「第二類」這個結果。
CASE WHEN COL_1 IN ( 'A', 'B') THEN '第一類' WHEN COL_1 IN ('A') THEN '第二類' ELSE '其它' END AS "類別"
CASE表達式可以在SQL中實現IF-THEN-ELSE型的邏輯,而不必使用PL/SQL。CASE的工作方式與DECODE類似,但推薦使用CASE,因為它與ANSI兼容。
對於CASE表達式,需要注意以下幾點內容:
(1)以CASE開頭,以END結尾。
(2)分支中WHEN後跟條件,THEN為顯示結果。
(3)ELSE為除此之外的默認情況,類似於高級語言程式中SWITCH CASE的DEFAULT,可以不加。
(4)END AS後跟別名,也可以去掉AS。
2、DECODE函數
DECODE的語法如下所示:
DECODE(VALUE,IF1,THEN1,IF2,THEN2,IF3,THEN3,…,ELSE),表示如果VALUE等於IF1,那麼DECODE函數的結果返回THEN1,…,如果不等於任何一個IF值,那麼返回空。
在使用DECODE函數時,需要注意以下幾點內容:
(1)Oracle在調用DECODE函數的時候,需要預先確定列的類型。
(2)確定DECODE返回值類型,是依據參數中第一個條件返回類型,之後所有的返回類型都依據第一個類型進行強制類型轉換。
(3)當Oracle在第一個條件返回類型為NULL的時候,默認將其作為字元串處理。
例如,下面的例子中,DECODE函數的返回值以SAL列為標準,即為數值型,而7499的返回值為字元串,所以,會報錯:
SYS@lhrdb> SELECT * FROM SCOTT.EMP M WHERE M.EMPNO IN (7369, 7499); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
如下的SQL語句會報錯(ORA-01722: invalid number):
SELECT DECODE(M.EMPNO, 7369, M.SAL, 7499, M.JOB) FROM SCOTT.EMP M WHERE M.EMPNO IN (7369, 7499);
若修改為如下形式,將SAL的列變為字元串就可以正常運行了。
SELECT DECODE(M.EMPNO, 7369, M.SAL||'', 7499, M.JOB) FROM SCOTT.EMP M WHERE M.EMPNO IN (7369, 7499);
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。
About Me:小麥苗
● 本文作者:小麥苗,只專註於資料庫的技術,更注重技術的運用
● 作者部落格地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於作者的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
● 題目解答若有不當之處,還望各位朋友批評指正,共同進步