NOT IN运算符在Oracle中没有按预期工作

时间:2015-04-20 10:17:00

标签: oracle null subquery notin

我有两张桌子:PROD和CUST 在SQL和SYBASE中运行以下查询时,它可以正常工作。 甲骨文没有给出任何结果。

select * FROM PROD
where PROD.SECID NOT IN (SELECT CUST.SECID FROM CUST WHERE SECID <> '')

注意: PROD.SECID具有所有空值。 CUST.SECID具有所有非空值(有效值)。

<>''没有从内部子查询中获取任何记录,因此我将其更改为IS NOT NULL,现在它将获取结果。

但问题是,当查询作为一个整体运行时,它不会给出任何结果,而它应该。

3 个答案:

答案 0 :(得分:4)

NOT IN按预期工作。如果你有空值,你不能说它是'在'给定的集合或否。

SQL> select case
  2         when null in (1, 2, 3) then 'in'
  3         when null not in (1, 2, 3) then 'not in'
  4         else 'null'
  5         end as result
  6  from dual;

RESULT
------
null     

如果您希望排除给定值,则应使用not exists,或者更好地使用反加入:

select p.*
from prod p, cust c
where p.secid = c.secid (+)
and c.secid is null;

答案 1 :(得分:1)

试试这个:

select PROD.* FROM PROD LEFT JOIN CUST 
ON  PROD.SECID = CUST.SECID 

答案 2 :(得分:1)

我注意到了两件事:

1)如果列表中至少有一个NULL值,则返回FALSE。因此,如果子查询返回NULL,则整个查询将返回0行。

2)子查询中存在无效过滤器:

WHERE SECID <> ''

此子句将返回0行以及&#39;&#39;与NULL相同,任何与NULL的比较(除了IS NULL / IS NOT NULL)都返回FALSE。请将其改写如下:

WHERE SECID IS NOT NULL