《decode函数的妙用》这篇文章中,提到两种写法,

SQL> select * from emp      where id=:id        and (name=:name or (name is null and :name is null));       SQL> select * from emp     where id=:id and decode(name, :name, 1)=1;

有位朋友在后台问到,

我尝试着解答下这两个问题。

问题1:这两种写法,效率有什么差异?

假设我们创建复合索引,(id,name),

SQL> create index idx_e_01 on emp (id, name);Index created.

从执行计划看,第一种写法,虽然用到了INDEX RANGE SCAN,但是谓词条件显示的,复合索引签到列id用上了索引,where条件中name相关部分,则是作为过滤条件的,

SQL> select * from emp      where id=:id and      (name=:name or (name is null and :name is null));        ID NAME---------- -------------------------         1 a-----------------------------------------------------------------------------| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |-----------------------------------------------------------------------------|   0 | SELECT STATEMENT |          |       |       |     1 (100)|          ||*  1 |  INDEX RANGE SCAN| IDX_E_01 |     1 |    27 |     1   (0)| 00:00:01 |-----------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - access("ID"=:ID)       filter(("NAME"=:NAME OR ("NAME" IS NULL AND :NAME IS NULL)))

对第二种写法,同样只是用到了复和索引前导列id,where条件中name相关部分,则是作为过滤条件的,

SQL> select * from emp      where id=:id and decode(name, :name, 1)=1;        ID NAME---------- -------------------------         2-----------------------------------------------------------------------------| Id  | Operation        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |-----------------------------------------------------------------------------|   0 | SELECT STATEMENT |          |       |       |     1 (100)|          ||*  1 |  INDEX RANGE SCAN| IDX_E_01 |     1 |    27 |     1   (0)| 00:00:01 |-----------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - access("ID"=:ID)       filter(DECODE("NAME",:NAME,1)=1)

从这两条SQL的10053看,cost的值是相同的,

Best so far:  Table#: 0  cost: 1.0002  card: 0.0082  bytes: 27

因此,这两种写法,在效率上,是相同的。

问题2:对第一种写法的理解,尤其是参数 is null?

针对测试数据,(id=1,name='a')和(id=2,name=''),

SQL> select * from emp;  ID  NAME---- -------   1  a   2

对(id=1,name='a'),这条SQL就够了,

SQL> select * from emp where id=:id and name=:name;

对(id=2,name=''),因为name是空,就会出现"name=null",但是Oracle中null=null返回的是false,判断空值,需要使用is null或者is not null,按照这种理解,字段name用is null为条件,同时按照语意,输入参数(绑定变量)是null,两个条件加起来,就是如下SQL,

SQL> select * from emp      where id=:id and (name is null and :name is null);

再将这两种情况,使用or或的关系,关联起来,就是这条SQL,

SQL> select * from emp     where id=:id     and (name=:name or (name is null and :name is null));

请体会下,如果还是有问题,欢迎提出来,一起讨论解决。

近期热文:

《公众号600篇文章分类和索引》

《Oracle ACE,一段不可思议的旅程》

《Oracle 19c之RPM安装》

《应用执行慢的问题排查路径》

《ACOUG年会感想》

《千万级表数据更新的需求》

《探寻大表删除字段慢的原因》

《一次Oracle bug的故障排查过程思考》

《新增字段的一点一滴技巧》

《对recursive calls的深刻理解》

《《Oracle Concept》第三章 - 12》

《一次惊心动魄的问题排查》

《英超梦幻之行》

《藤子不二雄博物馆之行》

《传控Tiki-Taka战术解惑》

decode函数_decode函数的妙用网友的两个问题解答相关推荐

  1. java 中decode函数_decode()函数使用技巧

    ·软件环境: 1.Windows NT4.0+ORACLE 8.0.4 2.ORACLE安装路径为:C:/ORANT ·含义解释: decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译 ...

  2. [云炬每日计算机小技能笔记]EXCEL中SUBSTITUTE函数的几个妙用

    EXCEL中SUBSTITUTE函数的几个妙用 在Excel表格中,如果数值带了单位,直接用SUM函数进行统计的话就会出现错误,因此通常的做法是去掉单位再计算.其实,如果用SUBSTITUTE结合SU ...

  3. Decode 是什么函数,功能是什么

    Decode 是一个函数,其功能是将编码过的数据转换为可读的形式.在计算机科学中,数据通常以二进制形式存储,例如在传输数据时.如果想要读取或者使用这些数据,就需要将其解码为人类可以理解的格式,比如字符 ...

  4. GlusterFS源码学习——函数指针数组的妙用

    GlusterFS使用C编写,源码中使用了大量的函数指针来实现模块化编程(是我自己以前没有接触过的编写方式),这样的方式可以很方便的实现功能扩展以及调用. 今天学习的是函数指针数组,也就是把相同系列的 ...

  5. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  6. mysql 条件 函数_mysql 函数 时间函数,数学函数,字符串函数,条件判断函数

    =========================================== mysql 相关函数 ============================================= ...

  7. 内置函数 ,匿名函数

    python之内置函数,匿名函数 内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本 ...

  8. JavaScript学习笔记——函数 Part4:向函数传递函数、从函数返回函数(函数是一等公民)

    要点 函数是值,这个值就是函数引用 函数是一等公民:函数引用是一等值 可将函数引用赋给变量.含在数据结构(如对象)中.传递给其他函数或从其他函数返回 函数是一等公民 不要再认为函数是特殊的,有别于Ja ...

  9. 信息摘要函数(Hash函数)的设计与性质验证

    1.信息摘要函数(Hash函数)的设计与性质验证实验 2.实验目的:信息摘要函数(Hash函数)的设计与性质验证. 2.1实验设备:PC机 一台/人 2.2实验原理: 2.2.1.信息摘要函数具有固定 ...

最新文章

  1. R可视化雷达图(Radar Charts)
  2. Excel 统计IP
  3. Kafka JMX 监控 之 jmxtrans + influxdb + grafana
  4. HDU 1071 The area
  5. Flutter实战一Flutter聊天应用(二十)
  6. Atitit Immutability 和final的优点
  7. 各省简称 拼音 缩写_中国各省市的简称读音
  8. 2012中国软件业务收入百强企业发布 (zz.IS2120)
  9. 白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)
  10. STM32学习之普通定时器是否能定时1us?
  11. arm64平台进程全局页表pgd的创建和切换
  12. 数据分析之EXCL筛选多列相同的数据(满足多列条件的数据)进行处理
  13. 电商后台设计:品类管理
  14. 程序人生 - 西瓜霜能吃下去吗?
  15. 视频号的直播玩法,手把手教你直播带货:国仁楠哥
  16. 文件标识位的区别r、r+、w、w+等
  17. 2.11 流水线加速比
  18. AD-NeRF 由音频和人脸图像合成人脸视频并表现出自然的说话风格
  19. 物理学(第七版)-- 牛顿运动定律
  20. 14种植物放入室内的奇异功效,为自己的健康而转

热门文章

  1. 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
  2. linux之sort 命令详解
  3. locust自己调试
  4. Php魔术函数学习与应用 __construct() __destruct() __get()等
  5. sonarqube下安装mysql数据库_本地安装SonarQube之一——win7环境安装mysql
  6. 宿松长铺程集高中2021年高考成绩查询,2017宿松程集中学录取分数线(附2017高考成绩喜报)...
  7. 湖北工业大学c语言作业答案,湖北工业大学C语言PPT
  8. 【以太坊】javascript控制台完整交易流程
  9. 【深度学习】利用神网框架分割病理切片中的癌组织(胃)
  10. 【深度学习】Dropout与学习率衰减