Oracle中的DECODE函數(shù)

          Decode:
            (指令解碼)由于X86指令的長度不一致,必須用一個(gè)單元進(jìn)行"翻譯",真正的內(nèi)核按翻譯后要求來工作。
            ---------------------------------------------------------------------------------------------------------------------------

            DECODE函數(shù)

            DECODE是Oracle公司獨(dú)家提供的功能,它是一個(gè)功能很強(qiáng)的函數(shù)。它雖然不是SQL的標(biāo)準(zhǔn),但對(duì)于性能非常有用。到目前,其他的數(shù)據(jù)庫供應(yīng)商還不能提供類似DECODE的功能,甚至有的數(shù)據(jù)庫的供應(yīng)商批評(píng)Oracle的SQL不標(biāo)準(zhǔn)。實(shí)際上,這種批評(píng)有些片面或不夠水平。就象有些馬車制造商抱怨亨利。福特的“馬車”不標(biāo)準(zhǔn)一樣。
            1 DECODE 中的if-then-else邏輯
            在邏輯編程中,經(jīng)常用到If – Then –Else 進(jìn)行邏輯判斷。在DECODE的語法中,實(shí)際上就是這樣的邏輯處理過程。它的語法如下:
            DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
            Value 代表某個(gè)表的任何類型的任意列或一個(gè)通過計(jì)算所得的任何結(jié)果。當(dāng)每個(gè)value值被測試,如果value的值為if1,Decode 函數(shù)的結(jié)果是then1;如果value等于if2,Decode函數(shù)結(jié)果是then2;等等。事實(shí)上,可以給出多個(gè)if/then 配對(duì)。如果value結(jié)果不等于給出的任何配對(duì)時(shí),Decode 結(jié)果就返回else 。
            需要注意的是,這里的if、then及else 都可以是函數(shù)或計(jì)算表達(dá)式。
            2 DECODE 的簡單例子
            Oracle系統(tǒng)中就有許多數(shù)據(jù)字典是使用decode 思想設(shè)計(jì)的,比如記錄會(huì)話信息的V$SESSION數(shù)據(jù)字典視圖就是這樣。我們從《Oracle8i/9i Reference》資料中了解到,當(dāng)用戶登錄成功后在V$SESSION中就有該用戶的相應(yīng)記錄,但用戶所進(jìn)行的命令操作在該視圖中只記錄命令的代碼(0—沒有任何操作,2—Insert…),而不是具體的命令關(guān)鍵字。因此,我們需要了解當(dāng)前各個(gè)用戶的名字及他們所進(jìn)行的操作時(shí),要用下面命令才能得到詳細(xì)的結(jié)果:
            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實(shí)現(xiàn)表的轉(zhuǎn)置
            數(shù)據(jù)庫中的表是由列和行構(gòu)成的一個(gè)二維表。一般列在任何數(shù)據(jù)庫中都是有限的數(shù)量,而行的變化較大,如果表很大,行的數(shù)量可能大上千萬行。同一列的不同行可能有不同的值,而且不是預(yù)先定義的。
            例:住房公積金報(bào)表置換實(shí)例:
            1.各個(gè)單位在本地經(jīng)辦行進(jìn)行開戶,開戶就是將單位的基本信息和職工信息的進(jìn)行登記;
            2.每月各個(gè)單位的會(huì)計(jì)到經(jīng)辦行交繳本單位的所有職工的住房公積金,系統(tǒng)記錄有每個(gè)職工的交繳明細(xì)并在每條記錄上記錄有經(jīng)辦行的代碼;
            3.每月、季、半年及年終都要求將經(jīng)辦行 變?yōu)?#8220;列”給出個(gè)月的明細(xì)報(bào)表:
            經(jīng)辦行:城西區(qū) 城東區(qū)
            月份:
            2001.01 xxxx1.xx xxxxx2.xx
            2001.02 xxxx3.xx xxxxx4.xx
            。 。 。 。 。 。
            原來的數(shù)據(jù)順序是:
            城西區(qū)2001.01 xxxxx1.xx
            城東區(qū)2001.01 xxxxx2.xx
            城西區(qū)2001.02 xxxxx3.xx
            城東區(qū)2001.02 xxxxx4.xx
            住房公積金系統(tǒng)記錄職工的每月交繳名細(xì)的pay_lst表結(jié)構(gòu)是:
            bank_code varchar2(6)NOT NULL, -- 經(jīng)辦行代碼
            acc_no varchar2(15) not null, -- 單位代碼(單位帳號(hào))
            emp_acc_no varchar2(20) not null, -- 職工帳號(hào)
            tran_date date not null, -- 交繳日期
            tran_val Number(7,2) not null, -- 交繳額
            sys_date date default sysdate, --系統(tǒng)日期
            oper_id varchar2(10) --操作員代碼
            這樣的表結(jié)構(gòu),一般按照將經(jīng)辦行作為行(row)進(jìn)行統(tǒng)計(jì)是很容易的,但是如果希望將經(jīng)辦行變?yōu)榱?column)這樣的格式來輸出就有困難。如果用DECODE函數(shù)來處理則變得很簡單:
            我們創(chuàng)建一個(gè)視圖來對(duì)目前的pay_lst表進(jìn)行查詢。將經(jīng)辦行代碼變?yōu)橐恍┚唧w的經(jīng)辦行名稱即可:
            CREATE OR REPLACE VIEW bank_date_lst AS
            Select to_char(tran_date,’yyyy.mm’),
            SUM( DECODE ( bank_code,’001’, tran_val,0 )) 城西區(qū),
            SUM( DECODE ( bank_code,’002’, tran_val,0 )) 城南區(qū),
            SUM( DECODE ( bank_code,’003’, tran_val,0 )) 城東區(qū)
            FROM pay_lst
            GROUP BY to_char(tran_date,’yyyy.mm’);
            建立視圖后,可直接對(duì)該視圖進(jìn)行查詢就可按照列顯示出結(jié)果。

          posted on 2009-03-31 16:48 球球 閱讀(478) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          留言簿(1)

          文章分類(19)

          文章檔案(19)

          積分與排名

          最新隨筆

          最新評(píng)論

          主站蜘蛛池模板: 濮阳市| 新巴尔虎左旗| 湘潭市| 金溪县| 赤城县| 大丰市| 台北县| 九龙坡区| 依安县| 定远县| 兴安县| 易门县| 南岸区| 凤山县| 保康县| 金溪县| 绩溪县| 屏东市| 葫芦岛市| 石景山区| 乡城县| 阿拉善左旗| 九台市| 肃北| 华容县| 彰武县| 林芝县| 杭锦后旗| 庆阳市| 临江市| 荥经县| 赤峰市| 扶绥县| 安宁市| 唐海县| 保德县| 修水县| 南陵县| 海阳市| 荥阳市| 阳山县|