千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,我们在写SQL时经常会用到in条件,如果in包含的值都是非NULL值,那么没有特殊的,但是如果in中的值包含null值(比如in后面跟一个子查询,子查询返回的结果有NULL值),Oracle又会怎么处
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 中国互联网科技股 科技互联网项目 互联网科技会 河南真二互联网科技有限公司 科技与互联网发展 互联网 卓越科技 奇酷互联网络科技 深圳互联网科技怎么样 互联网科技实习生岗位职责 互联网科技大赛获奖感言 互联网时代的科技公司 深圳互联网科技的发展 互联网科技包装股份有限公司上市 2021世界互联网领先科技成果发布 上海同邻互联网科技有限公司规模 云鲸互联网络科技有限公司 互联网时代科技型公司的机会 容联科技互联网电商 广东猫王互联网科技有限公司电话 互联网金融科技 科技互联网技术 深圳艾佳互联网科技 中国互联网金融科技基金 无锡溥仪互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 明优互联网科技有限公司 国大互联网教育科技有限公司薪资 江苏苏星互联网科技有限公司 云南省自由互联网科技有限公司
0