我在这个查询中使用Postgres
select
*
from Entity this_
where
(this_.ID not in (null))
为什么这不会给我带来任何结果?我希望得到id不为空的所有行
与
(this_.ID not in (1))
我得到了预期的结果
答案 0 :(得分:20)
[not] in (null)
的结果将始终为null。要与null进行比较,您需要is [not] null
或is [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条件下才具有这种行为。