• oracle 子查询中null的问题(in 和 not in)


    先看一下员工表:

    SELECT * FROM p_emp e 



    例子:查询员工表中不是领导的员工

    按正常逻辑思维:SQL语句应该为:

    SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp)


    但是输出结果为空,没有返回值

    再看:

    SELECT * FROM p_emp e WHERE e.empno IN (SELECT mgr FROM p_emp)

    这里有返回值

    这里的in后面的句子可以理解为or拼接,简单举例即

    in (9566,9839,null)可以等价于mgr=9566 or mgr=9839 or mgr=null,

    not in (9566,9839,null)可以等价于not(mgr=9566 or mgr=9839 or mgr=null)或mgr!=9566 and mgr!=9839 and mgr!=null。

    为什么都是or拼接,in可以而not in不可以呢,可以把not in理解为后面的and表达式就知道了,因为mgr=null为null,也就相当于false,导致整个表达式为false,无论传何值都为false,自然无法返回数据。

    当发现not in后的子查询后面有null值时,可以在子查询里用is not null或函数过滤null值。

     所以,最后的SQL语句应该为:

    SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp WHERE mgr IS NOT NULL)


    这些即为员工表中不是领导的员工
  • 相关阅读:
    Struts2标签库
    ognl表达式
    Struts2拦截器
    Struts2文件上传与下载
    Swoft2.x 小白学习笔记 (四) --- RPC
    Swoft2.x 小白学习笔记 (三) --- Task、协程
    Swoft2.x 小白学习笔记 (二) --- mysql、redis
    Swoft2.x 小白学习笔记 (一) ---控制器
    Tornado WebSocket简单聊天
    用python实现的21点游戏
  • 原文地址:https://www.cnblogs.com/sutao/p/7380220.html
Copyright © 2020-2023  润新知