風雨無阻

          關于ORACLE中的DECODE

          關于ORACLE中的DECODE- -

                                                

          關于DECODE

          DECODEOracle公司獨家提供的功能,它是一個功能很強的函數。它雖然不是SQL的標準,但對于性能非常有用。到目前,其他的數據庫供應商還不能提供類似DECODE的功能,甚至有的數據庫的供應商批評OracleSQL不標準。實際上,這種批評有些片面或不夠水平。就象有些馬車制造商抱怨亨利。福特的“馬車”不標準一樣。

          1  DECODE 中的if-then-else邏輯

          在邏輯編程中,經常用到If – Then –Else 進行邏輯判斷。在DECODE的語法中,實際上就是這樣的邏輯處理過程。它的語法如下:

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

          Value 代表某個表的任何類型的任意列或一個通過計算所得的任何結果。當每個value值被測試,如果value的值為if1Decode 函數的結果是then1;如果value等于if2Decode函數結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等于給出的任何配對時,Decode 結果就返回else

          需要注意的是,這里的ifthenelse 都可以是函數或計算表達式。

          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.住房公積金報表置換實例:

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

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

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

               經辦行:城西區        城東區 

          月份:

          2001.01      xxxx1.xx         xxxxx2.xx

          2001.02      xxxx3.xx         xxxxx4.xx 

            

          原來的數據順序是:

          城西區2001.01  xxxxx1.xx

          城東區2001.01  xxxxx2.xx

          城西區2001.02  xxxxx3.xx

          城東區2001.02  xxxxx4.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);

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

          2.希望將下面的列結果按照列的方式來顯示JOB內容:

          SQL> select empno,ename,job,sal,deptno from emp

            2  order by deptno,job;

               EMPNO ENAME      JOB              SAL     DEPTNO

          ---------- ---------- --------- ---------- ----------

                7934 MILLER     CLERK           1300         10

                7782 CLARK       MANAGER         2450         10

                7839 KING       PRESIDENT       5000         10

                7788 SCOTT      ANALYST         3000         20

                7369 SMITH      CLERK            800         20

                7876 ADAMS       CLERK           1100         20

                7566 JONES      MANAGER         2975         20

                7938 趙元杰     軟件           12345         20

                7698 BLAKE      MANAGER         2850         30

                7499 ALLEN      SALESMAN        1600         30

                7654 MARTIN     SALESMAN        1250         30

                7844 TURNER     SALESMAN        1500         30

                7521 WARD       SALESMAN        1250         30

          18 rows selected.

          再看下面的查詢結果:

          SQL> select deptno,job,sum(sal) from emp group by deptno,job;

              DEPTNO JOB         SUM(SAL)

          ---------- --------- ----------

                  10 CLERK           1300

                  10 MANAGER         2450

                  10 PRESIDENT       5000

                  20 ANALYST         3000

                  20 CLERK           1900

                  20 MANAGER         2975

                  20 軟件           74070

                  30 MANAGER         2850

                  30 SALESMAN        5600

          9 rows selected.

          從上面的結果看,如果希望將JOB置換成列的方式,則只要用DECODEJOB列進行描述即可。創建的視圖如下:

          create or replace view empv as

          select deptno,

          sum( decode(job,ANALYST, sal,0)) ANALYST,

          sum( decode(job,CLERK, sal,0)) CLERK,

          sum( decode(job,MANAGER, sal,0)) MANAGER,

          sum( decode(job,PRESIDENT, sal,0)) PRESIDENT,

          sum( decode(job,SALESMAN, sal,0)) SALESMAN,

          sum( decode(job,軟件, sal,0)) 軟件

          from emp  group by deptno;

          具體運行的顯示樣本如下:

          SQL> create or replace view empv as

            2  select deptno,

            3  sum( decode(job,'ANALYST', sal,0)) ANALYST,

            4  sum( decode(job,'CLERK', sal,0)) CLERK,

            5  sum( decode(job,'MANAGER', sal,0)) MANAGER,

            6  sum( decode(job,'PRESIDENT', sal,0)) PRESIDENT,

            7  sum( decode(job,'SALESMAN', sal,0)) SALESMAN,

            8  sum( decode(job,'軟件', sal,0)) 軟件

            9  from emp  group by deptno;

          View created.

          SQL> select * from empv;

          DEPTNO    ANALYST      CLERK    MANAGER  PRESIDENT   SALESMAN       軟件

          ---------- ---------- ---------- ---------- ---------- ----------10          0       1300       2450       5000          0          0

          20       3000       1900       2975          0          0      74070

          30          0          0       2850          0       5600          0 

          posted on 2008-11-13 15:59 秋楓故事 閱讀(2931) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          新聞檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 随州市| 龙里县| 黔西县| 馆陶县| 肃宁县| 衡阳市| 雷波县| 铜鼓县| 潜江市| 公安县| 府谷县| 梁河县| 米易县| 延津县| 蕉岭县| 五河县| 井冈山市| 舒城县| 克东县| 黄骅市| 汉阴县| 南部县| 通榆县| 丹凤县| 洞头县| 民和| 延长县| 偃师市| 普洱| 攀枝花市| 兴安盟| 长沙市| 合水县| 岢岚县| 濮阳县| 松滋市| 阳西县| 华坪县| 金昌市| 贞丰县| 德钦县|