• 售前

  • 售后

热门帖子
入门百科

Oracle DECODE函数语法使用介绍

[复制链接]
fsxjjv 显示全部楼层 发表于 2021-10-26 13:22:53 |阅读模式 打印 上一主题 下一主题
Oracle DECODE函数功能很强,下面就为您详细先容Oracle DECODE函数的用法,渴望可以让您对Oracle DECODE函数有更多的了解。

Oracle DECODE函数

Oracle 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 代表某个表的任何范例的恣意列或一个通过盘算所得的任何效果。当每个value值被测试,如果value的值为if1,Decode 函数的效果是then1;如果value等于if2,Decode函数效果是then2;等等。毕竟上,可以给出多个if/then 配对。如果value效果不等于给出的任何配对时,Decode 效果就返回else 。
须要留意的是,这里的if、then及else 都可以是函数或盘算表达式。
寄义表明:
DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

该函数的寄义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)

ELSE
RETURN(缺省值)
END IF

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.各个单元在当地经办行举行开户,开户就是将单元的基本信息和职工信息的举行登记;
2.每月各个单元的管帐到经办行交缴本单元的全部职工的住房公积金,系统记载有每个职工的交缴明细并在每条记载上记载有经办行的代码;
3.每月、季、半年及年终都要求将经办行 变为“列”给出个月的明细报表:
经办行:城西区 城东区
月份:
2001.01 xxxx1.xx xxxxx2.xx
2001.02 xxxx3.xx xxxxx4.xx
。 。 。 。 。 。
原来的数据次序是:
城西区2001.01 xxxxx1.xx
城东区2001.01 xxxxx2.xx
城西区2001.02 xxxxx3.xx
城东区2001.02 xxxxx4.xx
住房公积金系统记载职工的每月交缴名细的pay_lst表布局是:

bank_code varchar2(6)NOT NULL, -- 经办行代码
acc_no varchar2(15) not null, -- 单元代码(单元帐号)
emp_acc_no varchar2(20) not null, -- 职工帐号
tran_date date not null, -- 交缴日期
tran_val Number(7,2) not null, -- 交缴额
sys_date date default sysdate, --系统日期
oper_id varchar2(10) --操作员代码

这样的表布局,一样平常按照将经办行作为行(row)举行统计是很容易的,但是如果渴望将经办行变为列(column)这样的格式来输出就有困难。如果用DECODE函数来处理则变得很简朴:
我们创建一个视图来对如今的pay_lst表举行查询。将经办行代码变为一些具体的经办行名称即可:
复制代码 代码如下:
CREATE OR REPLACE VIEW bank_date_lst AS
Select to_char(tran_date,'yyyy.mm'),
SUM( DECODE ( bank_code,'001', tran_val,0 )) 城西区,
SUM( DECODE ( bank_code,'002', tran_val,0 )) 城南区,
SUM( DECODE ( bank_code,'003', tran_val,0 )) 城东区
FROM pay_lst
GROUP BY to_char(tran_date,'yyyy.mm');

创建视图后,可直接对该视图举行查询就可按照列表现出效果。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作