Oracle decode函數


decode函數在Oracle SQL查詢語句中的使用非常廣泛,也經常應用到PL/SQL語句塊中。
decode()函數語句的基本表達式是:

decode(expr1,expr2,expr3,[expr4])

作如下理解該表達式:
  (1),如果expr1 = expr2,decode函數返回expr3表達式的值;
  (2),如果expr1 != expr2,decode函數返回expr4表達式的值,如果expr4未指定,則返回null;

補充:

Decode函數的語法結構還包括如下:
decode (expression, search_1, result_1)
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)

decode (expression, search_1, result_1, default)
decode (expression, search_1, result_1, search_2, result_2, default)
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)

decode函數比較表達式和搜索字,如果匹配,返回結果;如果不匹配,返回default值;如果未定義default值,則返回空值。

二 應用

1 使用decode函數分段

   將成績表中分數大於90分的分為優秀,80~90分為良好,70~80分為中等,60~70分為及格,60分以下為不及格。

           

          (sign()函數的作用是,判斷參數的值大於0則返回1,等於0則返回0,小於0則返回-1;

             如圖,當socre大於或等於90時,socre-90>=0,sign()函數返回1或0,則輸出‘優秀’,

             在score-90<0的情況下,再判斷socre-80,socre-80>=0,sign()函數返回1或0,則輸出‘良好’,

             以此類推,用decode()的嵌套配合sign()函數來實現對分數的分段以及相應的輸出,

             最后60分以下的就default為‘不及格’就可以了,可以看到我們的Tony老師的分數就不及格了)

 

2 使用decode函數對表做行列轉換

             

如圖所示,有一張三個科目的成績表,各科目名稱和相應的分數呈現在行中,

現想將各科目名稱轉換為列名,每列的內容為對應科目的分數。

             

             (如圖,先用decode函數判斷subject為Chinese時,輸出score,不為Chinese時,輸出為NULL,

                因為共有三個科目,所以輸出其中一個科目的分數時,其他科目的分數為NULL,這里只需要

                用sum()函數來實現聚合的作用,將空值去除掉就可以了)

              

               (group by先將name分組了,然后sum()函數分別將name為John的每個列的值相加,如Chinese列,

                  80+NULL+NULL=80,再將name為Will的每個列的值相加,最終達到如上圖聚合的效果)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM