Oracle DECODE函式的語法介紹

2021-06-05 08:20:04 字數 2873 閱讀 1040

oracle decode函式功能很強,下面就為您詳細介紹oracle

decode函式的用法,希望可以讓您對oracle decode函式有更多的了解。

oracle decode函式

oracle decode函式是oracle公司獨家提供的功能,它是乙個功能很強的函式。它雖然不是sql的標準,但對於效能非常有用。到目前,其他的資料庫**商還不能提供類似decode的功能,甚至有的資料庫的**商批評oracle的sql不標準。實際上,這種批評有些片面或不夠水平。就象有些馬車製造商抱怨亨利。福特的「馬車」不標準一樣。

1 decode 中的if-then-else邏輯

在邏輯程式設計中,經常用到if – then –else 進行邏輯判斷。在decode的語法中,實際上就是這樣的邏輯處理過程。它的語法如下:

decode(value, if1, then1, if2,then2, if3,then3, . . . else )

value 代表某個表的任何型別的任意列或乙個通過計算所得的任何結果。當每個value值被測試,如果value的值為if1,decode 函式的結果是then1;如果value等於if2,decode函式結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等於給出的任何配對時,decode 結果就返回else 。

需要注意的是,這裡的if、then及else 都可以是函式或計算表示式。

含**釋:

decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)

該函式的含義如下:

if 條件=值1 then

return(翻譯值1)

elsif 條件=值2 then

return(翻譯值2)

......

elsif 條件=值n then

return(翻譯值n)

else

return(預設值)

end if

2 decode 的簡單例子

oracle系統中就有許多資料字典是使用decode 思想設計的,比如記錄會話資訊的v$session資料字典檢視就是這樣。我們從《oracle8i/9i reference》資料中了解到,當使用者登入成功後在v$session中就有該使用者的相應記錄,但使用者所進行的命令操作在該檢視中只記錄命令的** (0—沒有任何操作,2—insert…),而不是具體的命令關鍵字。因此,我們需要了解當前各個使用者的名字及他們所進行的操作時,要用下面命令才能得到 詳細的結果:

select sid,serial#,username,

decode(command,

0,』none』,

2,』insert』,

3,』select』,

6,』update』,

7,』delete』,

8,』drop』,

『other』) cmmand

from v$session where username is not null;

3 decode實現表的轉置

資料庫中的表是由列和行構成的乙個二維表。一般列在任何資料庫中都是有限的數量,而行的變化較大,如果表很大,行的數量可能大上千萬行。同一列的不同行可能有不同的值,而且不是預先定義的。

例:住房公積金報表置換例項:

1.各個單位在本地經辦行進行開戶,開戶就是將單位的基本資訊和職工資訊的進行登記;

2.每月各個單位的會計到經辦行交繳本單位的所有職工的住房公積金,系統記錄有每個職工的交繳明細並在每條記錄上記錄有經辦行的**;

3.每月、季、半年及年終都要求將經辦行 變為「列」給出個月的明細報表:

經辦行:城西區 城東區

月份:2001.01 ***x1.xx ***xx2.xx

2001.02 ***x3.xx ***xx4.xx

。 。 。 。 。 。

原來的資料順序是:

城西區2001.01 ***xx1.xx

城東區2001.01 ***xx2.xx

城西區2001.02 ***xx3.xx

城東區2001.02 ***xx4.xx

住房公積金系統記錄職工的每月交繳名細的pay_lst表結構是:

bank_code varchar2(6)not null, -- 經辦行**

acc_no varchar2(15) not null, -- 單位**(單位帳號)

emp_acc_no varchar2(20) not null, -- 職工帳號

tran_date date not null, -- 交繳日期

tran_val number(7,2) not null, -- 交繳額

sys_date date default sysdate, --系統日期

oper_id varchar2(10) --操作員**

這樣的表結構,一般按照將經辦行作為行(row)進行統計是很容易的,但是如果希望將經辦行變為列(column)這樣的格式來輸出就有困難。如果用decode函式來處理則變得很簡單:

我們建立乙個檢視來對目前的pay_lst表進行查詢。將經辦行**變為一些具體的經辦行名稱即可:

create or replace view bank_date_lst as

select to_char(tran_date,』yyyy.mm』),

sum( decode ( bank_code,』001』, tran_val,0 )) 城西區,

sum( decode ( bank_code,』002』, tran_val,0 )) 城南區,

sum( decode ( bank_code,』003』, tran_val,0 )) 城東區

from pay_lst

group by to_char(tran_date,』yyyy.mm』);

建立檢視後,可直接對該檢視進行查詢就可按照列顯示出結果。

oracle decode函式的用法

該函式可以接受可變的引數,具體引數情況如下 decode 條件,值1,翻譯值1,值2,翻譯值2,值n,翻譯值n,預設值 該函式的含義如下 if 條件 值1 return 翻譯值1 else if 條件 值2 return 翻譯值2 else if 條件 值n return 翻譯值n else ret...

oracle decode函式的使用

由於近期的一點點工作,學習了一點點oracle的東西,僅記錄一點 decode函式和sign函式配合在sql語句中做判斷。decode 語法 decode expression,compare1,value1,compare2,value2,defaultvalue 意思很簡單,如果expressi...

Oracle DECODE函式的語法

oracle decode函式功能很強,下面就為您詳細介紹oracle decode函式的用法,希望可以讓您對oracle decode函式有更多的了解。oracle decode函式 oracle decode函式是oracle公司獨家提供的功能,它是乙個功能很強的函式。它雖然不是sql的標準,但...