正常情况下null<>null 的,但是在union中如果有两个null值,那么只会显示一个。
1.null<>null
下例中可以看出null<>null
SQL> select * from dual;
DU
--
X
SQL> select * from dual where null=null;
未选定行
可以看出加上条件那么是查不出数据的,可以看出null<>null;
2.union 中null值
都知道union是去除的,那么既然null<>null,那么会显示几个null值呢
首先创建两个表
SQL> create table t1(x int);
表已创建。
SQL> create table t2(x int);
表已创建。
插入测试数据
SQL> Insert into t1 values(1);
已创建 1 行。
SQL> Insert into t1 values(null);
已创建 1 行。
SQL> Insert into t2 values(null);
已创建 1 行。
查询语句
用PL/SQL DEV来显示比较明显
可以看出显示出来时两条数据
那这是什么原理呢?这是oracle内部有一个未公开的函数sys_op_map_nonnull 我们开测试一下这个函数
SQL> select sys_op_map_nonnull(null) from dual;
SYS_OP_MAP_NONNULL(NULL)
------------------------
FF
看到sys_op_map_nonnull(null) =FF 那么oracle在union时会自动的调用这个函数,自动的转换,FF=FF所以就过滤掉了。
接着最开始的语句再测试下
SQL> select * from dual where sys_op_map_nonnull(null) = sys_op_map_nonnull(null);
DU
--
X
可以看到它们是相等的
在oracle内部会经常用这个函数来处理null的。