oracle常用函数-decode

       Decode函数在实际开发中非常的有用,而且功能比较强大,与其他函数结合,能让很多的工作变得简单;

DECODE(字段, 条件1, 结果值1,  条件2, 结果值2, …默认值);  

该函数的含义如下:

IF 条件=1 THEN

RETURN(翻译值1)

ELSIF 条件=2 THEN

RETURN(翻译值2)

......

ELSIF 条件=n THEN

RETURN(翻译值n)

ELSE

RETURN(缺省值)

END IF

 

比较常见的一些用法:

1、比较大小

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

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

例如:

select decode(sign(10-20),-1,10,20) from dual;

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

 

2、生成固定位数的序列号

我们看我们的水电煤等各种单子,经常有类似这种 2013000000000004这种固定长度的序列,我们可以结合Lpad函数,使主键的值自动加1并在前面补0

select ‘2013‘ || LPAD(decode(count(ID),0,1,max(to_number(ID)+1)),12,‘0‘) 记录编号 from FFM83

FFM83 是一张做测试的表,ID是它的流水ID,有3条数据;

注意:这种写法虽然简单,但是如果用户多,在高并发情况下,可能会生成同样的序列号;

如果在高并发的情况下,可以参考下面这种写法:

select ‘2013‘ || LPAD(SEQ_ FFM83.NEXTVAL,12,‘0‘) 记录编号 from FFM83

SEQ_ FFM83是和FFM83表对应的一个SEQUENCE

 

3、简化多个条件的查询

比如我要查询男、女生的数量分别是多少?

通常我们这么写:

select count(*) from where 性别男;

select count(*) from where 性别女;

这样至少要查询2次,如果有更加多的选择的话,那么数据库的访问量会更加多;

decode呢,只需要一句话

select sum(decode(sex,‘‘,1,0)),sum(decode(sex,‘‘,1,0)) from ffm83

ffm83 表中有一个sex字段,直接放了汉字的男女属性;

 

4、在Order by中使用Decode对指定字段进行排序

按照计算机,数学专业进行排序

例:

select * from ffm83 order by decode(subject, ‘计算机‘, 1, ‘数学‘, 2,10);

运行结果为:

    1      计算机    2013/1/4

    2     数学       2013/3/13

    3     数学       2013/3/18

注意:在大数据量的排序中,尽量不要使用这种方式,数据库开销非常大;

 

5、将竖表转横表

我们要统计2013年上半年每个月有多少人,最好直接拉出来一张类似报表的样子。如果用常规的方法,会比较麻烦,用DECODE就会相对简单

SELECT SUM(DECODE(TO_CHAR(DT, ‘MM‘), ‘01‘, 1,0)) AS "1

     , SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘02‘, 1,0)) AS "2

     , SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘03‘, 1,0)) AS "3

     , SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘04‘, 1,0)) AS "4

     , SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘05‘, 1,0)) AS "5

     , SUM(DECODE(TO_CHAR(DT, ‘MM‘),‘06‘, 1,0)) AS "6

  FROM FFM83;

运行结果如下:

1      0     2     0     0     0

 

备注:

FF83的结构:

create table FFM83

(

  SEX     VARCHAR2(2),

  ID      INTEGER,

  SUBJECT VARCHAR2(32),

  DT      DATE

);

表中的数据为:

    1      计算机    2013/1/4

    2     数学       2013/3/13

    3     数学       2013/3/18

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。