码迷,mamicode.com
首页 > 数据库 > 详细

oracle常用函数-decode

时间:2015-01-07 18:52:54      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:oracle   数据库   竖表转横表   

       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

oracle常用函数-decode

标签:oracle   数据库   竖表转横表   

原文地址:http://blog.csdn.net/ffm83/article/details/42496569

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!