oracle提供的有用函式 待續

2021-09-06 03:06:56 字數 4199 閱讀 8595

decode函式

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』);

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

nvl函式完成了乙個簡單但有用的功能。任何時候給它乙個空值,它都返回乙個你所選擇的值。這種能夠自動替換空值的能力有助於提供看上去更為完善的輸出。nvl函式的語法如下:

nvl(input_source,result_if_input_value_is_null)   其中input_source一般是乙個列名。result_if_input_value_is_null 可以是任何值:直接值(即硬編碼)、對其他列的引用或者表示式

注意:nvl函式實際上並不是更新表中的值。原資料仍保持不變。

nvl 有乙個怪癖,它要求input_source和result_if_input_value_is_null的資料型別是相同的;如果希望此函式在發現空 值時顯示流行的「n/a」就會出現問題。因為「n/a」是文字,如果input_value是乙個文字列,就沒有問題了。但是,如果在乙個日期或數值列中 查詢空值,將需要對input_value列應用to_char函式,以便使input_value也成為文字。  

nvl是如果null, 則取指定值

例:nvl(yanlei777,0) > 0

nvl(yanlei777, 0) 的意思是 如果 yanlei777 是null, 則取 0值

通過查詢獲得某個欄位的合計值,如果這個值為null將給出乙個預設的預設值

例如:select nvl(sum(t.dwxhl),1)

from tb_jhde t

就表示如果sum(t.dwxhl) = null 就返回 1

另乙個有關的有用方法

declare i integer

select nvl(sum(t.dwxhl),1) into i from tb_jhde t where zydm=-1這樣就可以把獲得的合計值儲存到變數

i中,如果查詢的值為null就把它的值設定為預設的1

orcale中:

select nvl(rulescore,0) from zwjc_graderule where rulecode='fwtd';

如果記錄中不存在rulecode ='fwtd'的資料.則查不出資料.

select nvl(rulescore,0) into rule_score from zwjc_graderule where rulecode='fwtd';會報查不到資料的錯

select nvl(sum(rulescore),0) from zwjc_graderule where rulecode='fwtd';

如果記錄中不存在rulecode ='fwtd'的資料.還是可以得到一行列名為nvl(rulescore,0),值為0的資料.

select nvl(sum(rulescore),0) into rule_score from zwjc_graderule where rulecode='fwtd'; 不會報錯

oracle 幾個有用但不常用的函式

select substr abcd 2,2 value from dual 取字串 select replace abcdefbcd bcd 你 value from dual 替換字串 select translate fasdbfasegas fa 我 value from dual sele...

有用的php函式

一 檔案靜態化 檔案讀取函式 檔案讀取函式 function php read file name fclose fd return buf 如果知道的是檔案的連線位址的話 fileaddress http localhost filename.html 檔案所在的位址 function php r...

極其有用的函式

如需使用sleep函式 那麼在程式的最開始加上下面這一行 注意呼叫的時候sleep的s要大寫 private declare sub sleep lib kernel32 byval dwmilliseconds as long 生成乙個指定範圍的隨機數 private function rndz ...