zoukankan      html  css  js  c++  java
  • Oracle 中 流程控制函数 decode用法

    函数介绍  

            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

      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 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。需要注意的是,这里的if、then及else 都可以是函数或计算表达式。

            当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。

    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) 比较大小

                    select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值 

                    sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1 

                     例如:  变量1=10,变量2=20 , 则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。 

          (2)表、视图结构转化

                   a. 纵表转横表

    纵表结构: TEST_Z2H   
    FNAME       FTYPE             FVALUE   
    员工        zaocan              10  
    员工       zhongcan             20  
    员工        wancan              5  

    转换后的表结构:

      FNAME     ZAOCAN_VALUE          ZHONGCAN_VALUE       WANCAN_VALUE   

       员工           10                     20                    5  

       

    1 --纵表转横表SQL示例:   
    2   SELECT FNAME,   
    3        SUM(DECODE(FTYPE,'zaocan',FVALUE,0)) AS ZAOCAN_VALUE,   
    4        SUM(DECODE(FTYPE,'zhongcan',FVALUE,0)) AS ZHONGCAN_VALUE,   
    5        SUM(DECODE(FTYPE,'wancan',FVALUE,0)) AS WANCAN_VALUE   
    6   FROM TEST_Z2H   
    7   GROUP BY FNAME; 

            b. 横表纵表

    横表结构: TEST_H2Z   
          ID      姓名     语文       数学        英语         
          1       张三     80         90         70               
          2       李四     90         85         95             
          3       王五     88         75         90             
        
    转换后的表结构:     
          ID      姓名     科目     成绩     
          1       张三     语文     80     
          2       张三     数学     90     
          3       张三     英语     70     
          4       李四     语文     90     
          5       李四     数学     80       
          6       李四     英语     99     
          7       王五     语文     85     
          8       王五     数学     96     
          9       王五     英语     88   
    1 --横表转纵表SQL示例:   
    2 SELECT   姓名,'语文'   AS     科目,语文   AS   成绩   FROM   TEST_H2Z   UNION   ALL    
    3 SELECT   姓名,'数学'   AS     科目,数学   AS   成绩   FROM   TEST_H2Z   UNION   ALL    
    4 SELECT   姓名,'英语'   AS     科目,英语   AS   成绩   FROM   TEST_H2Z   
    5 ORDER BY 姓名,科目 DESC;  
  • 相关阅读:
    147
    UVA12230 过河 Crossing Rivers
    重聚
    网络流24题 P2762 太空飞行计划问题
    网络流24题 P2756 飞行员配对方案问题
    网络流24题
    洛谷 P3369 【模板】普通平衡树
    LOJ #6280. 数列分块入门 4
    LOJ #6279. 数列分块入门 3
    LOJ #6278. 数列分块入门 2
  • 原文地址:https://www.cnblogs.com/xiaoxiaoweng/p/7473231.html
Copyright © 2011-2022 走看看