oracle中in包含空,Oracle的条件in中包含NULL时的处理

本文探讨了Oracle SQL中in和notin条件遇到NULL值时的行为,指出in包含NULL值会导致不查到NULL行,而notin包含NULL会无结果。通过实例解析了查询优化器如何处理这些情况,并提醒开发者注意子查询可能带来的NULL值问题。
摘要由CSDN通过智能技术生成

我们在写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)说明我们前面的猜测是正确的

7facc3a4560691f5290d0c0b341023e0.png

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如何处理

a9aa2282810a77a6f7627904daaf3642.png

从上图可以看出当不管id值为NULL值或非NULL值,id = NULL的结果都是UNKNOWN,也相当于FALSE。所以上面的查结果只查出了1和3两条记录。

查看执行计划看到优化器对IN的改写

26b3cf585d3f0e5cc712fed19a5beaaf.png

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的改写

02a778de6807edfa814afc536ab5c5d8.png

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的改写

490104bdac279aa229a229463048eacb.png

总结一下,使用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时的处理

一.创建一个含表,表中只有一列为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 ...

随机推荐

Adb connection Error:远程主机强迫关闭了一个现有的连接

在用手机调试程序时,有时会出现“Adb connection Error:远程主机强迫关闭了一个现有的连接”的错误. 出现这种错误时,可以按照以下步骤解决: (1)运行cmd.exe,并将目录CD到\ ...

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

本章问题 1.char *p="hello world";与char p[]="hello world"的问题. 简单说前者是一个指向字符串常量的指针,后者是一 ...

svn认证失败时的解决

删除用户目录下的.subversion文件夹,这个文件夹记录了密码! rm .subversion/ -rf

javascript-设置div隐藏

html code:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值