decode函数_decode函数的妙用网友的两个问题解答
《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函数的妙用网友的两个问题解答相关推荐
- java 中decode函数_decode()函数使用技巧
·软件环境: 1.Windows NT4.0+ORACLE 8.0.4 2.ORACLE安装路径为:C:/ORANT ·含义解释: decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译 ...
- [云炬每日计算机小技能笔记]EXCEL中SUBSTITUTE函数的几个妙用
EXCEL中SUBSTITUTE函数的几个妙用 在Excel表格中,如果数值带了单位,直接用SUM函数进行统计的话就会出现错误,因此通常的做法是去掉单位再计算.其实,如果用SUBSTITUTE结合SU ...
- Decode 是什么函数,功能是什么
Decode 是一个函数,其功能是将编码过的数据转换为可读的形式.在计算机科学中,数据通常以二进制形式存储,例如在传输数据时.如果想要读取或者使用这些数据,就需要将其解码为人类可以理解的格式,比如字符 ...
- GlusterFS源码学习——函数指针数组的妙用
GlusterFS使用C编写,源码中使用了大量的函数指针来实现模块化编程(是我自己以前没有接触过的编写方式),这样的方式可以很方便的实现功能扩展以及调用. 今天学习的是函数指针数组,也就是把相同系列的 ...
- python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)
一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...
- mysql 条件 函数_mysql 函数 时间函数,数学函数,字符串函数,条件判断函数
=========================================== mysql 相关函数 ============================================= ...
- 内置函数 ,匿名函数
python之内置函数,匿名函数 内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本 ...
- JavaScript学习笔记——函数 Part4:向函数传递函数、从函数返回函数(函数是一等公民)
要点 函数是值,这个值就是函数引用 函数是一等公民:函数引用是一等值 可将函数引用赋给变量.含在数据结构(如对象)中.传递给其他函数或从其他函数返回 函数是一等公民 不要再认为函数是特殊的,有别于Ja ...
- 信息摘要函数(Hash函数)的设计与性质验证
1.信息摘要函数(Hash函数)的设计与性质验证实验 2.实验目的:信息摘要函数(Hash函数)的设计与性质验证. 2.1实验设备:PC机 一台/人 2.2实验原理: 2.2.1.信息摘要函数具有固定 ...
最新文章
- R可视化雷达图(Radar Charts)
- Excel 统计IP
- Kafka JMX 监控 之 jmxtrans + influxdb + grafana
- HDU 1071 The area
- Flutter实战一Flutter聊天应用(二十)
- Atitit Immutability 和final的优点
- 各省简称 拼音 缩写_中国各省市的简称读音
- 2012中国软件业务收入百强企业发布 (zz.IS2120)
- 白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)
- STM32学习之普通定时器是否能定时1us?
- arm64平台进程全局页表pgd的创建和切换
- 数据分析之EXCL筛选多列相同的数据(满足多列条件的数据)进行处理
- 电商后台设计:品类管理
- 程序人生 - 西瓜霜能吃下去吗?
- 视频号的直播玩法,手把手教你直播带货:国仁楠哥
- 文件标识位的区别r、r+、w、w+等
- 2.11 流水线加速比
- AD-NeRF 由音频和人脸图像合成人脸视频并表现出自然的说话风格
- 物理学(第七版)-- 牛顿运动定律
- 14种植物放入室内的奇异功效,为自己的健康而转
热门文章
- 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
- linux之sort 命令详解
- locust自己调试
- Php魔术函数学习与应用 __construct() __destruct() __get()等
- sonarqube下安装mysql数据库_本地安装SonarQube之一——win7环境安装mysql
- 宿松长铺程集高中2021年高考成绩查询,2017宿松程集中学录取分数线(附2017高考成绩喜报)...
- 湖北工业大学c语言作业答案,湖北工业大学C语言PPT
- 【以太坊】javascript控制台完整交易流程
- 【深度学习】利用神网框架分割病理切片中的癌组织(胃)
- 【深度学习】Dropout与学习率衰减