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的每個列的值相加,最終達到如上圖聚合的效果)