<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風雨無阻

    關于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等于if2,Decode函數結果是then2;等等。事實上,可以給出多個if/then 配對。如果value結果不等于給出的任何配對時,Decode 結果就返回else 。

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

    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)

    隨筆分類

    隨筆檔案

    新聞檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲综合色区在线观看| 四虎在线免费视频| 在线播放亚洲精品| 中文毛片无遮挡高清免费| 天天影院成人免费观看| 久久久久久a亚洲欧洲AV| 亚洲性一级理论片在线观看| 国产亚洲福利一区二区免费看 | 亚洲av午夜电影在线观看| 久久高潮一级毛片免费| 最好看的中文字幕2019免费| 国产精品另类激情久久久免费| 中文字幕亚洲日本岛国片| 亚洲国产精品xo在线观看| 在线观看片免费人成视频播放| 精品久久洲久久久久护士免费| 亚洲一区无码中文字幕| 亚洲国产成人91精品| 最近最新MV在线观看免费高清| 亚洲AV无码专区国产乱码电影| 免费人成又黄又爽的视频在线电影| 久久精品国产免费观看| 亚洲an日韩专区在线| 99re这里有免费视频精品 | 久久久久亚洲精品中文字幕| 国产精品福利片免费看| 日本人护士免费xxxx视频| 亚洲综合激情另类小说区| 国产精品内射视频免费| 亚洲国产精品一区第二页| 一级毛片在线完整免费观看| 免费看片A级毛片免费看| 羞羞漫画页面免费入口欢迎你| 扒开双腿猛进入爽爽免费视频| 亚洲精品日韩中文字幕久久久| 无码乱肉视频免费大全合集| 久久亚洲AV无码精品色午夜| 久久综合九色综合97免费下载| 亚洲精品第一国产综合境外资源| 亚洲av无码专区亚洲av不卡| 久久久久亚洲AV成人网人人软件|