Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 在not in中使用null的问题

以前还专门小总结过一下Oracle中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没发现的需要注意的地方,那就是在not in中使用null的问题。SQL> select * from dept;    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTONSQL> select deptno
  2  from dept
  3  where deptno in (10,50,null);    DEPTNO
----------
        10//看到使用in的时候即便有null 也是正常的 下面看一下not inSQL> select deptno
  2  from dept
  3  where deptno not in (10,50);    DEPTNO
----------
        20
        30
        40//这里看起来和我们的预期挺符合的哦SQL> select deptno
  2  from dept
  3  where deptno not in (10,50,null);no rows selected//怎么回事 为什么加了个null 前面的20、30、40三条数据就不显示出来了 IN和NOT IN本质上都是OR运算,因而计算逻辑OR时处理NULL的方式不同,产生的结果也不同。下面我们分析一下前面的三条语句 SQL> select deptno
  2  from dept
  3  where deptno in (10,50,null);这里可以等价于where deptno=10 or deptno=50 or deptno=null,由于是or相连接,那么只要有一个条件为TRUE,整个就喂TRUE了。所以deptno为10的记录显示出来了。 SQL> select deptno
  2  from dept
  3  where deptno not in (10,50,null);这里等价于where not (deptno=10 or deptno=50 or deptno=null),拿deptno=20的记录来举例吧。not (20=10 or 20=50 or 20=null)not(false or false or null)not nullnull(以前只知道在where条件返回false的时候不成立,现在看来返回NULL的时候也不成立呀,下面是做的一个小实验可以证明这个猜想)#####################SQL> select * from dept
  2  where 1=null;no rows selected#####################SQL> select deptno
  2  from dept
  3  where deptno not in (10,50);这里等价于where not (deptno=10 or deptno=50),依然拿deptno=20来举例。not (20=10 or 20=50 )not(false or false)not falsetrue注意:FALSE OR NULL=NULL ,而TRUE OR NULL=TRUE。Oracle 11gR2 创建数据库实例Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明相关资讯      Oracle数据库基础教程 
  • 在Oracle数据库中插入含有&符号的  (03/06/2013 09:20:14)
  • Oracle 执行计划更改导致数据加工  (02/13/2013 14:45:04)
  • 判断Oracle Sequence是否存在  (02/13/2013 14:32:26)
  • Oracle数据库中无法对数据表进行  (02/26/2013 14:24:58)
  • Oracle 在同一台主机上建立用户管  (02/13/2013 14:40:58)
  • Oracle em 无法启动,报not found错  (02/13/2013 14:29:48)
本文评论 查看全部评论 (0)
表情: 姓名: 字数