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

● 本系列題目來源於作者的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

● 題目解答若有不當之處,還望各位朋友批評指正,共同進步