在Oracle的诸多SQL函数中,笔者认为最容易被忽视的强大功能函数就是decode。在Decode函数的帮助下,很多要使用case when字句或者要使用PL/SQL游标处理的需求,可以方便的在一句SQL中加以实现。本篇主要从介绍Decode语法入手,提示一个使用Decode的陷阱。

1、Decode语句实例和语法

首先,我们先从一个例子看起,顺便准备环境。

SQL> select * from v$version where rownum<2;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production

SQL> create table t (id number, ori_value varchar2(10), res_value varchar2(10));

Table created

//数据准备结果

SQL> select * from t;

ID ORI_VALUERES_VALUE

---------- ---------- ----------

1 T

2 T

3 M

4 E

5 L

6 E

6 rows selected

SQL需求:对res_value字段赋值,如果ori_value为‘T’,则取值为‘TEST’;如果为‘E’,则取值为‘EXIT’。其他情况赋值为‘VALID’。借助decode函数,此类需求很容易实现。

SQL> update t set res_value=decode(ori_value, --条件表达式

2'T','TEST', --condition 1:ori_value='T'

3'E','EXIT', --condition 2:ori_value='E'

4'VALID'--others:

5);

6 rows updated

SQL> commit;

Commit complete

SQL> select * from t;

ID ORI_VALUERES_VALUE

---------- ---------- ----------

1 TTEST

2 TTEST

3 MVALID

4 EEXIT

5 LVALID

6 EEXIT

6 rows selected

看似复杂的需求,通过简单的decode函数匹配处理,就在一个SQL中解决了。Decode函数是Oracle的一个集合处理函数。下面是Decode的语法结构图示:

Decode是一个不定参数个数的函数类型。通过search/result配对来进行条件匹配,匹配的数量不定。最后存在一个default值,如果都没有匹配上,就返回default值。注意,这个default值是可选的。

Decode函数在Oracle内部,也是普遍使用的一种函数类型。一个场景就是实现user/all/dba字典视图层与$数据字典表之间的映射。因为在XXX$数据字典表中,很多数字、字符类型,都需要翻译为易于理解的编码方式。如下面片段。

CREATE OR REPLACE VIEW DBA_OBJECTS

(owner, object_name, subobject_name, object_id, data_object_id, object_type, created, last_ddl_time, timestamp, status, temporary, generated, secondary, namespace, edition_name)

AS

select u.name, o.name, o.subname, o.obj#, o.dataobj#,

decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',

4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',

7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',

11, 'PACKAGE BODY', 12, 'TRIGGER',

该片段就是实现了从”_CURRENT_EDITION_OBJ”数据列向dba_objects数据表之间的映射。

还要一个细节需要注意,如果字段匹配中使用的是null值,可以在search中直接使用null值。如下例所示:

SQL> select id, ori_value,

2decode(ori_value, --条件表达式

3null,'TEST', --condition 1:ori_value is null

4ori_value--others:

5) as results

6from t

7where id>5;

ID ORI_VALUERESULTS

---------- ---------- ----------

6 EE

7TEST

3、默认值default陷阱

在Oracle官方文档中,包括了对Decode函数的解析,全文如下:

“DECODE compares expr to each search value one by one. If expr is equal to a search, then Oracle Database returns the corresponding result. If no match is found, then Oracle returns default.If default is omitted, then Oracle returns null.”

从上面的解释看,Decode是一个顺序匹配的过程。不断将表达式与search进行匹配,如果匹配上,返回结果。如果没有匹配上,就继续匹配。如果所有都没有成功匹配,就返回default值。注意:如果用户没有确定default值,且出现无法匹配的情况,函数返回null值。

这就存在一个风险,如果匹配出现了意想之外的取值,而书写者没有设置默认值,这样赋值就会出现空值的情况。

SQL> update t set res_value=decode(ori_value, --条件表达式

2'T','TEST', --condition 1:ori_value='T'

3'E','EXIT' --condition 2:ori_value='E'

4--No Others, No Default:

5);

7 rows updated

SQL> select * from t;

ID ORI_VALUERES_VALUE

---------- ---------- ----------

1 TTEST

2 TTEST

3 M

4 EEXIT

5 L

6 EEXIT

7

7 rows selected

所以,为了从安全性角度考虑,使用decode的时候最好还是设置默认值,避免这种情况的发生。

oracle 函数默认参数设置,Decode函数的默认值陷阱相关推荐

  1. java main函数的参数设置_main函数参数

    C语言通常允许main()函数带有两个参数,可由用户自己命令,但类型是固定的.第一个参数是整型,第二个参数是一个指向字符型指针数组的指针或一个基本类型为字符型的指针数组,此时传给形参的值只能从命令行中 ...

  2. matlab 可变参数与默认参数设置

    1. 基本思路 矩阵矢量化编程,而不是循环和遍历: GPU 并行计算: 使用稀疏矩阵: 2. 实践 可变长输入参数,输出参数,需要解析(使用大括号进行索引): varargin varargout 函 ...

  3. 把一个函数作为参数传入到函数中

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  4. python默认参数举例_Python中的默认参数详解

    文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对 ...

  5. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  6. c语言默认参数_5.1 C++有默认参数的函数

    点击上方"C语言入门到精通",选择置顶 第一时间关注程序猿身边的故事 作者 闫小林 白天搬砖,晚上做梦.我有故事,你有酒么? C++有默认参数的函数在函数调用时形参从实参获取值,因 ...

  7. python函数默认参数_Python中函数的默认参数问题

    前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多. 由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题. 在主流程中,仅仅发现了一个对时间赋值的语句,并 ...

  8. oracle order by 指定顺序---decode函数

    ORDER BY 用法 --指定排序 SQL语句中 order by 可以按照指定的顺序排序否 比如 记录中 某字段值 NCH HCH ACS TWN.... ORDER BY DECODE(col, ...

  9. Oracle 的 SQL语句中 decode()函数

    decode()函数简介: 主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明): 使用方法: Select decode(columnname,值1,翻译值1,值2,翻译值2,.. ...

最新文章

  1. 从指定文件夹里COPY指定的一批文件列表(TXT文件)
  2. 2072. Kirill the Gardener 3
  3. 用枚举来处理java自定义异常
  4. 网易云推出了一组程序猿の真实写照【文末有彩蛋】
  5. ZOJ1654(二分构图题典例)
  6. RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and
  7. 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
  8. Linux系统编程(七)消息队列
  9. VIP客户服务系统设计(四)——按用户角色构思系统功能(上)
  10. HBase 从下载到安装和运行
  11. vuex的知识点笔记
  12. oracle ebs fa_category_books,FA有用的脚本 - Oracle EBS R12 - ITPUB论坛-中国专业的IT技术社区...
  13. u盘数据恢复软件哪个好?怎么恢复u盘数据?
  14. 03 三维地图添加切片图层
  15. 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析
  16. 大兴机场临空区爆出大规划!
  17. Linux ssh登陆命令
  18. 拉线传感器的数显仪表在测量中起到多大的作用
  19. 单例设计模式(饿汉式VS懒汉式)
  20. git回退commit的操作

热门文章

  1. 大国重器:人民币跨境支付系统CIPS
  2. 次世代游戏建模人的红利期真要来了,3D角色建模价格竟高达100万一个,元宇宙高薪抢占人才
  3. 64位格式化字符串漏洞利用——axb_2019_fmt64
  4. SELECT 语句 (七部分)
  5. FPGA打砖块游戏设计(有上板照片)VHDL
  6. 网站如何预防被黑?被黑了又该怎么办?
  7. 北邮网研mysql概念面试_回馈王道--2014北邮网研经验贴---初试+复试
  8. Python-多任务总结
  9. 使用python建立newmark位移预测模型、
  10. rtl81xxe vlan部分处理原理以及GPIO处理原理。