Postgres NOT IN(null)没有结果

时间:2013-07-26 08:58:37

标签: postgresql null notin

我在这个查询中使用Postgres

select 
*
from Entity this_ 
where 
(this_.ID not in (null))

为什么这不会给我带来任何结果?我希望得到id不为空的所有行

(this_.ID not in (1))

我得到了预期的结果

6 个答案:

答案 0 :(得分:20)

[not] in (null)的结果将始终为null。要与null进行比较,您需要is [not] nullis [not] distinct from null

select *
from Entity this_ 
where this_.ID is not null

如果您想在评论中使用where (ID not in (1,null)),可以

where ID is not null and ID not in (1)

答案 1 :(得分:8)

PostgreSQL使用NULL作为未定义的值 您要问的是返回不在列表中的项目或未定义的值。由于undefined意味着你不知道里面是什么,PostgreSQL不会返回任何项目,因为根本无法响应请求。
请求时:

select * from Entity where id in (1, null)

可以返回记录,因为如果它找到ID = 1的元素,则知道它在集合中 请求:

select * from Entity where (ID not in (1, null))

无法满足,因为空值可以是任何值。

答案 2 :(得分:0)

select * 
from Entity this_ 
where (this_.ID not in (null))

“ IN”或“ NOT IN”不选择NULL值 您可以写

select * 
from Entity this_ 
where (this_.ID not in (1))

您的选择将不包含空值

答案 3 :(得分:0)

您可以使用<> ANY运算符。 代码示例:

select 
  * 
from Entity this_ 
where 
   (this_.ID <> ANY (null))

答案 4 :(得分:0)

我遇到了类似的 in 问题,并最终提出了以下解决方案;

select * from public."Employee_11" where (COALESCE("Name",'@'),"Surname") 
    in (
        ('@','dummy')
    )

它确实返回 Name 列具有空值的记录。您也可以将其用于 not in 子句,该子句将返回非空的 Name ;

记录。
  select * from public."Employee_11" where (COALESCE("Name",'@'),"Surname") 
        not in (
            ('@','dummy')
        )

答案 5 :(得分:0)

我有类似的问题。我非常了解SQL的自我被刺穿了。 这是scott / tiger表中的简化示例。

select empno, ename from emp where deptno not in (10, 20, null);

什么也没返回。尽管我非常谨慎地使用NOT IN条件,因为它不使用索引并且非常慢。我更喜欢使用OUTER JOIN。

我在Postgres和Oracle中都尝试了此查询,结果是相同的。因此,必须是符合标准的结果。 NULL仅在NOT IN条件下才具有这种行为。