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;  
时间: 2024-10-05 10:02:31

Oracle 中 流程控制函数 decode用法的相关文章

Oracle中常用的to_Char用法详解

Oracle中常用的to_Char用法详解(有FMT的详细列表) The following are number examples for the to_char function. to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73'

oracle 中start with 的用法

oracle 中start with 的用法 发表于2013/3/3 23:29:35  40191人阅读 分类: Oracle oracle 提供了start with connect by 语法结构可以实现递归查询. 1. 一个简单举例: SQL> select *  from test; BILL_MONTH           DAY_NUMBER MSISDN -------------------- ---------- -------------------- 200803    

oracle中insert all的用法

oracle中insert all的用法 现在有个需求:将数据插入多个表中.怎么做呢?可以使用insert into语句进行分别插入,但是在oracle中有一个更好的实现方式:使用insert all语句. insert all语句是oracle中用于批量写数据的 .insert all分又为无条件插入和有条件插入. 一.表和数据准备 --创建表 CREATE TABLE stu( ID NUMBER(3), NAME VARCHAR2(30), sex VARCHAR2(2) ); --删除表

Oracle中的时间函数用法(to_date、to_char) (总结)

一.24小时的形式显示出来要用HH24 select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual; 二.to_date() function 1.日期格式参数含义说明 D一周中的星期几 DAY天的名字,使用空格填充到9个字符 DD月中的第几天 DDD年中的第几天 DY天的简写名 IW ISO标准

【Oracle】Oracle中dump函数的用法

一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全没有参数时,直接返回null.另外3个参数也都有各自的默认值: expr:这个参数是要进行分析的表达式(数字或字符串等,可以是各个类型的值) return_fmt:指返回参数的格式,有5种用法: 1)8:以8进制返回结果的值 2)10:以10进制返回结果的值(默认) 3)16:以16进制返回结果的值 4)17:以单字符的形式返回结果

Oracle 中的Pivoting Insert用法

1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) 例子: insert into dep (dep_id,dep_name) values(1,'技术部'); 备注:使用标准语法只能插入一条数据,且只能在一张表中插入数据 2, 无条件 Insert all --多表多行插入 语法: INSERT [ALL] [condition_insert_clause] [i

oracle 中GROUP BY的用法

转自:http://blog.csdn.net/basenet855x/article/details/6694150 问题: select item.itemnum,item.in1,item.in4,inventory.location from item,inventory where item.itemnum=inventory.itemnum and inventory.location='DYB' and item.in1='D/MTD/MRM' GROUP BY ITEM.ITEM

oracle中 merge into 的用法

很多时候我们需要通过筛选条件同时对表进行 更新,插入,删除 等操作.这样如果我们单一的去操作表会显得很麻烦,下面会说到这个merge  into 的用法会极大的优化我们操作表的时间和代码量. 举例,先新建2个表: create table book( id number, name varchar(64), price number, primary key(id) ) create table pbook as select * from book delete pbook 这里create

Oracle 中MERGE语句的用法(转载)

原文章出处(http://blog.csdn.net/lichkui/article/details/4306299) MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT.这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE. //表1create table subs(msid number(9),