DECODE函数使用

DECODE函数,是ORACLE公司的SQL软件ORACLE PL/SQL所提供的特有函数计算方式,DECODE函数是ORACLE PL/SQL的功能强大的函数之一,了解使用DECODE函数很有必要。

1 DECODE 中的if-then-else逻辑

在逻辑编程中,经常用到If – Then –Else 进行逻辑判断。在DECODE的语法中,实际上就是这样的逻辑处理过程。它的语法如下:
  DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
  Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。
  需要注意的是,这里的if、then及else 都可以是函数或计算表达式。

2 DECODE实现表的转置,这里主要介绍这个作用。

数据库中的表是由列和行构成的一个二维表。一般列在任何数据库中都是有限的数量,而行的变化较大,如果表很大,行的数量可能大上千万行。同一列的不同行可能有不同的值。
例如表A,结构式

FYEAR  VARCHAR2(50)
年份
FSCORE VARCHAR2(50) 分数
RNUMBER NUMBER  分数对应级别





数据如下:


2010  75 3

2010 95 4

2010 50 5

2010 5 6

2009 5 2

2010 25 1

2008 5 19

2008 25 16

2008 50 14

2008 75 11

2008 95 7


现需要查出每一年的级别数,如下图:
分数    年份  5%  25% 50% 75% 95%
级别 2010
2009
一般sql不好实现,原因数据库表存的是纵表,而页面显示的要求是横表,要求不能更改表结构。
因此使用decode函数
用decode()方法改写sql:
select m.f_year,
                             nvl(max(decode(m.fscore, '5', m.fnumber)),0) f5,
                             nvl(max(decode(m.fscore, '25', m.fnumber)),0) f25,
                             nvl(max(decode(m.fscore, '50', m.fnumber)),0) f50,
                             nvl(max(decode(m.fscore, '75', m.fnumber)),0) f75,
                             nvl(max(decode(m.fscore, '95', m.fnumber)),0) f95
                        from A m
                       where 1 = 1
                       group by m.f_year
输出结果:
F_YEAR  F5     F25 F50 F75 F95
2008     19      16 14 11 7
2009      2   0 0 0 0
2010      6 1 5 3 4

猜你喜欢

转载自xinshaxin.iteye.com/blog/1587036