Oracle的条件in中包含NULL时的处理
我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面跟一个子查询,子查询返回的结果有NULL值),Oracle又会怎么处理呢?
创建一个测试表t_in
linuxidc@linuxidc>create table t_in(id number);
linuxidc@linuxidc>select * from t_in;
 
    ID
----------
    1
    2
    3
 
    4
现在t_in表中有5条记录
1、in条件中不包含NULL的情况
linuxidc@linuxidc>select * from t_in where id in (1,3);
 
    ID
----------
    1
    3
 
2 rows selected.
上面的条件等价于id =1 or id = 3得到的结果正好是2;查看执行计划中可以看到 2 - filter("ID"=1 OR "ID"=3)说明我们前面的猜测是正确的

2、in条件包含NULL的情况
linuxidc@linuxidc>select * from t_in where id in (1,3,null);
 
    ID
----------
    1
    3
 
2 rows selected.
上面的条件等价于id = 1 or id = 3 or id = null,我们来看下图当有id = null条件时Oracle如何处理

从上图可以看出当不管id值为NULL值或非NULL值,id = NULL的结果都是UNKNOWN,也相当于FALSE。所以上面的查结果只查出了1和3两条记录。
查看执行计划看到优化器对IN的改写

3、not in条件中不包含NULL值的情况
linuxidc@linuxidc>select * from t_in where id not in (1,3);
 
    ID
----------
    2
    4
 
2 rows selected.
上面查询的where条件等价于id != 1 and id !=3,另外t_in表中有一行为null,它虽然满足!=1和!=3但根据上面的规则,NULL与其他值做=或!=比较结果都是UNKNOWN,所以也只查出了2和4。
从执行计划中看到优化器对IN的改写

4、not in条件中包含NULL值的情况
linuxidc@linuxidc>select * from t_in where id not in (1,3,null);
 
no rows selected
上面查询的where条件等价于id!=1 and id!=3 and id!=null,根据上面的规则,NULL与其他值做=或!=比较结果都是UNKNOWN,所以整个条件就相当于FALSE的,最终没有查出数据。
从执行计划中查看优化器对IN的改写

总结一下,使用in做条件时时始终查不到目标列包含NULL值的行,如果not in条件中包含null值,则不会返回任何结果,包含in中含有子查询。所以在实际的工作中一定要注意not in里包含的子查询是否包含null值。
linuxidc@linuxidc>select * from t_in where id not in (select id from t_in where id = 1 or id is null);
 
no rows selected
Oracle的条件in中包含NULL时的处理的更多相关文章
- Oracle的条件in包含NULL时的处理
		一.创建一个含表,表中只有一列为id,该列中含有值为NULL的记录 我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面 ... 
- Oracle 在not in中使用null的问题
		http://www.linuxidc.com/Linux/2012-07/66212.htm 以前还专门小总结过一下Oracle中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没 ... 
- MySQL中处理Null时要注意两大陷阱
		MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值不一定为空 空值是一个比较特殊的字段. ... 
- C#程序读取数据库中包含null的列的值
		private void btn2_Click(object sender, RoutedEventArgs e) { using (SqlConnection ... 
- Java规则之条件语句中做空判断时使用||和&&常犯的错误
		错误代码示例: public String bar(String string) { //error 1 if (string!=null || !string.equals("" ... 
- oracle中查询条件包含null时
		不能使用=null或者!=null 应该使用is null和is not null 
- js传递参数中包含+号时的处理方法
		encodeURI(url).replace(/\+/g, '%2B') 例子: $scope.getAnesthesiawaystatistical = function (annual, anes ... 
- asp.net mvc中包含webapi时,token失效产生302的解决方案
		public void ConfigureAuth(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOpt ... 
- python字典中包含列表时:查找字典中某个元素及赋值
		直接上代码: 运行效果: 
随机推荐
- 【Spring】17、spring cache 与redis缓存整合
			spring cache,基本能够满足一般应用对缓存的需求,但现实总是很复杂,当你的用户量上去或者性能跟不上,总需要进行扩展,这个时候你或许对其提供的内存缓存不满意了,因为其不支持高可用性,也不具备持 ... 
- 详解Java中对象的软、弱和虚引用的区别
			对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ... 
- pullMsg有感
			开发功能过程中,始终会有些东西是确认的,比如美丑.业务是否合理.对错. 如果明知道不合理,却按照已有规定.框架.设计去开发,其实是不够职业. 好的做法是朝对的方向去push,并落地: 次之是去push ... 
- laravel compact的用法
			向视图中传递变量 我们在开发web应用当中,通常都不是为了写静态页面而生的,我们需要跟数据打交道,那么这个时候,问题就来了,在一个MVC的框架中,怎么将数据传给视图呢?比如我们要在 ArticleCo ... 
- Andorid 刷新样式一
			一.Gradle中的Build.gradle依赖项目 compile 'com.github.moduth:blockcanary-android:1.1.0' debugCompile 'com.s ... 
- react-conponent-secondesElapsed
			<!DOCTYPE html> <html> <head> <script src="../../build/react.js">& ... 
- 微信小程序-查询快递
			1.新建快速启动项目 2.在设置里面勾选不校验合法域名,以防编译报错 3.在app.json中改一下窗口表现:app.json—"navigationBarTitleText": ... 
- 洛谷P4591 [TJOI2018]碱基序列(hash dp)
			题意 题目链接 Sol \(f[i][j]\)表示匹配到第\(i\)个串,当前在主串的第\(j\)个位置 转移的时候判断一下是否可行就行了.随便一个能搞字符串匹配的算法都能过 复杂度\(O(|S| K ... 
- java 不使用paint方法进行画图
			private Graphics2D g; g = (Graphics2D) getGraphics(); 
- Android为TV端助力 同时setTag两次,保存多种值
			示例代码: view.setTag(R.string.action_settings,hodler.content); 接收两个值,一个是key值,必须是唯一值,而且要写在values/ids.xml ... 
