Oracle Decode函式詳解

2021-06-10 21:49:26 字數 3080 閱讀 5427

函式介紹

decode函式是oracle pl/sql的功能強大的函式之一,目前還只有oracle公司的sql提供了此函式,其它資料庫廠商的sql實現還沒有此功能。decode有什麼用途呢?先構造乙個例子,假設我們想給智星職員加工資,其標準是:工資在8000元以下的加20%;工資在8000元或以上的加15%,通常的做法是,先選出記錄中的工資字段值? select salary into var-salary from employee,然後對變數var-salary用if-then-else或choose case之類的流控制語句進行判斷。如果用decode函式,那麼我們就可以把這些流控制語句省略,通過sql語句就可以直接完成。如下:select decode(sign(salary - 8000),>=0,salary*1.15,<0,salary*1.2,salary) from employee 是不是很簡潔? decode的語法:decode(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等於if1時,decode函式的結果返回then1,...,如果不等於任何乙個if值,則返回else。初看一下,decode 只能做等於測試,但剛才也看到了,我們通過一些函式或計算替代value,是可以使decode函式具備大於、小於或等於功能。

decode是oracle公司獨家提供的功能,它是乙個功能很強的函式。它雖然不是sql的標準,但對於效能非常有用。到目前,其他的資料庫**商還不能提供類似decode的功能,甚至有的資料庫的**商批評oracle的sql不標準。實際上,這種批評有些片面或不夠水平。就象有些馬車製造商抱怨亨利。福特的「馬車」不標準一樣。在邏輯程式設計中,經常用到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 都可以是函式或計算表示式。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;資料庫中的表是由列和行構成的乙個二維表。一般列在任何資料庫中都是有限的數量,而行的變化較大,如果表很大,行的數量可能大上千萬行。同一列的不同行可能有不同的值,而且不是預先定義的。

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

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的標準,但...