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。

  • 相关阅读:
    Ubuntu升级软件和ubuntu升级系统的命令
    ASP 中如何根据数据库中取出的值来判定 checkbox或radio 的状态是否为选中
    C# 根据年、月、周、星期获得日期等
    鼠标右击事件
    【原创】VB利用堆栈实现算术表达式计算
    【算法】VB6实现哈夫曼编码生成的类
    【算法】VB 24点计算
    【算法】VB实现后缀表达式转中缀表达式
    C#操作Excel替换关键字 Johan
    C#递归遍历文件夹下的文件 Johan
  • 原文地址:https://www.cnblogs.com/xiaoL/p/4353411.html
Copyright © 2011-2022 走看看