zoukankan      html  css  js  c++  java
  • Oracle 在not in中使用null的问题

    http://www.linuxidc.com/Linux/2012-07/66212.htm

    以前还专门小总结过一下Oracle中关于NULL的一些问题,碰巧今天在看书的过程中又看到了另外一个以前没发现的需要注意的地方,那就是在not in中使用null的问题。

    SQL> select * from dept;

        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON

    SQL> select deptno
      2  from dept
      3  where deptno in (10,50,null);

        DEPTNO
    ----------
            10

    //看到使用in的时候即便有null 也是正常的 下面看一下not in

    SQL> 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 null

    null

    (以前只知道在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 false

    true

    注意:FALSE OR NULL=NULL ,而TRUE OR NULL=TRUE。

  • 相关阅读:
    Javascript中的Math.max()和Math.min()
    附件预览项目采坑记
    移动设备后台的理解
    网络是怎么连接的?(进阶一)
    Git建立本地分支和远程分支的映射关系
    springboot使用redis实现发布与订阅
    centos下安装配置mongodb
    vue循环时设置多选框禁用状态,v-for
    谷歌浏览器postman插件安装,亲测可用
    element-ui 无法对绑定表单的对象中的对象属性进行验证
  • 原文地址:https://www.cnblogs.com/xiaoL/p/4353411.html
Copyright © 2011-2022 走看看