union中null值合并原理
正常情况下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
可以看到它们是相等的sql中union多表合并
在oracle内部会经常⽤这个函数来处理null的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论