大家好,又见面了,我是你们的朋友全栈君。
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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160118.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...