Oracle SQL查询时NULL字段对查询结果的影响

    今天在做一些oracle sql查询练习,突然遇到如下问题:

    查询使用的实例表结构是oracle内置用户hr下的employees表,我的目标是查出哪些员工跟Pat(FIRST_NAME)、Fay(LAST_NAME)不在同一个部门(非关联子查询)。


我使用如下关联查询语句(1号):

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE NOT EXISTS (SELECT 1
          FROM employees e1
         WHERE e1.department_id = e.department_id
           AND e1.first_name = 'Pat'
           AND e1.last_name = 'Fay');

 

 查询结果如下图:


而当我使用如下查询语句时(2号):

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE EXISTS
 (SELECT 1
          FROM employees e1
         WHERE e1.first_name = 'Pat'
           AND e1.last_name = 'Fay'
           AND e1.department_id <> e.department_id);

 查询结果却是这样:

 




逻辑并没有错,可为什么差了一条,将两个结果进行minus,得出相差的那条记录为


这条记录部门号为NULL,终于明白是有NULL参与比较导致的。

又使用如下代码进行了实验:

 

SELECT CASE
         WHEN NULL = NULL OR NULL <> NULL OR NULL = 'a' OR 'a' > NULL OR
              'a' < NULL THEN
          'a'
         WHEN 'b' is not null and '' is NULL THEN
          'b'
         ELSE
          'c'
       END
  FROM dual;

 

 得出结果为:b,说明有NULL参与的比较运算得到的都是false。


于是最终2号将代码改为:

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE EXISTS
 (SELECT 1
          FROM employees e1
         WHERE e1.first_name = 'Pat'
           AND e1.last_name = 'Fay'
           AND NVL(e1.department_id,0) <> NVL(e.department_id,0));

 

 得到的记录数与1号代码一致。


结论:对存在NULL字段的进行比较时,应该注意去空。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值