千家信息网

Oracle的where条件in/not in中包含NULL时的处理

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面跟一个子查询,子查询返回的结果有NULL值),Oracle又会怎么处
千家信息网最后更新 2024年11月28日Oracle的where条件in/not in中包含NULL时的处理

我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面跟一个子查询,子查询返回的结果有NULL值),Oracle又会怎么处理呢?

创建一个测试表t_in

zx@TEST>create table t_in(id number);Table created.zx@TEST>insert into t_in values(1);1 row created.zx@TEST>insert into t_in values(2);1 row created.zx@TEST>insert into t_in values(3);1 row created.zx@TEST>insert into t_in values(null);1 row created.zx@TEST>insert into t_in values(4);1 row created.zx@TEST>commit;Commit complete.zx@TEST>select * from t_in;        ID----------         1         2         3         4

现在t_in表中有5条记录

1、in条件中不包含NULL的情况

zx@TEST>select * from t_in where id in (1,3);        ID----------         1         32 rows selected.

上面的条件等价于id =1 or id = 3得到的结果正好是2;查看执行计划中可以看到 2 - filter("ID"=1 OR "ID"=3)说明我们前面的猜测是正确的

2、in条件包含NULL的情况

zx@TEST>select * from t_in where id in (1,3,null);        ID----------         1         32 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值的情况

zx@TEST>select * from t_in where id not in (1,3);        ID----------         2         42 rows selected.

上面查询的where条件等价于id != 1 and id !=3,另外t_in表中有一行为null,它虽然满足!=1和!=3但根据上面的规则,NULL与其他值做=或!=比较结果都是UNKNOWN,所以也只查出了2和4。

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

4、not in条件中包含NULL值的情况

zx@TEST>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值。

zx@TEST>select * from t_in where id not in (select id from t_in where id = 1 or id is null);no rows selected


官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements005.htm#SQLRF51096

http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions013.htm#SQLRF52169

http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions004.htm#SQLRF52116


条件 结果 查询 面的 情况 等价 中包 规则 处理 特殊 一行 上图 下图 个子 官方 实际 常会 数据 文档 是非 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全博览会上海 大话西游2目前服务器开服时间 长春正规网络技术咨询经验丰富 清理大师软件开发商 网络安全领域政府占比 检测空间使用情况属于数据库 计算机网络技术专业毕业答辩 黄冈放心的软件开发公司 规模大的oa办公软件开发哪家好 公安民警关于网络安全心得 网络安全美篇银行 通讯软件开发公司简介 买一款收费软件可以装服务器上吗 政府机关 维护网络安全 软件开发中常见错误 中国网络安全国家一级运营商 二道区网络技术服务质量推荐 河南网络技术转让销售电话 防疫软件开发优惠 硬件软件开发需要会什么 数据库附加提示权限不够 广东制作定制软件开发 遵义租房软件开发 基础软件开发需要掌握 数据库系统的分区表 dns服务器的ip地址 江阴品牌软件开发信息推荐 腾讯 嵌入式软件开发 自己的笔记本如何不被服务器查到 学校网络安全宣传周方案
0