我在这个查询中使用 Postgres
select
*
from Entity this_
where
(this_.ID not in (null))
为什么这没有给我任何结果?我希望得到 id 不为空的所有行
和
(this_.ID not in (1))
我得到了预期的结果
我在这个查询中使用 Postgres
select
*
from Entity this_
where
(this_.ID not in (null))
为什么这没有给我任何结果?我希望得到 id 不为空的所有行
和
(this_.ID not in (1))
我得到了预期的结果
的结果[not] in (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)
PostgreSQL 使用 NULL 作为未定义的值。
您要求的是返回不在列表中或未定义值中的项目。由于 undefined 意味着你不知道里面有什么,PostgreSQL 不会返回任何项目,因为根本无法响应请求。
虽然请求:
select * from Entity where id in (1, null)
可以返回记录,因为如果它找到 ID = 1 的元素,则知道该元素在集合
中,则请求:
select * from Entity where (ID not in (1, null))
不能满足,因为空值可以是任何值。
解决方案已在此答案中发布,我的解决方案几乎相同:
where
"field" is NOT NULL
AND "field" not in (1)
不要忘记,条件 ( is null or in (list)
) 的反转版本使用-OR
运算符(而不是AND
):
where
"field" is NULL
OR "field" in (1)
这是一个优秀的 SQL 开发人员在潜意识中的某处(该请求在 Postgres 中测试过,但我很确定这是标准 ANSI SQL 的行为):
select
-- simple things
1 = 1, -- true
1 = 2, -- false
-- "simple things" with null
1 = null, -- null (and it is not `false` if you expected this)
1 != null, -- null (and it is not `true` if you expected this)
-- "strange" area:
null = null, -- null (and it is not `true` and not `false`)
null != null, -- null (and it is not `true` and not `false`)
1 > null, -- null (yeah, after 4 previous examples it is exactly what you expected)
1 < null, -- null
null < null, -- null
null > null, -- null
-- value IN ()
1 in (1,2), -- true
1 in (1,null), -- true
1 in (2, 3), -- false
1 in (2, null), -- !!! null
-- value NOT IN
1 not in (1,2), -- false
1 not in (1,null), -- false
1 not in (2, 3), -- true
1 not in (2, null), -- !!! null
-- NULL IN/NOT IN
null in (1,2), -- null
null in (NULL), -- null
null not in (1,2), -- null
null not in (NULL), -- null
-- and surprise:
NOT NULL -- !! NULL (but most probably you foresaw/knew this)
如您所见 - 如果 thenull
是一个操作数,那么结果是null
and 在布尔上下文中(例如,在WHERE
-clauses 中) - 它是falsey。虽然,falsey与false不同,并且NOT (1=NULL)
是 NULL,但不是truly
,所以这两个请求都返回 0 行:
-- 1
select 1 where (1 = null)
-- 2
select 1 where NOT (1 = null)
我希望它有用
select *
from Entity this_
where (this_.ID not in (null))
“IN”或“NOT IN”不要选择NULL值你可以写
select *
from Entity this_
where (this_.ID not in (1))
并且您的选择将不包含空值
我有类似的问题。我对 SQL 很了解的自尊心被戳破了。这是来自 scott/tiger 表的简化示例。
select empno, ename from emp where deptno not in (10, 20, null);
什么也没回。尽管我非常谨慎地使用 NOT IN 条件,因为它不使用索引并且非常慢。我更喜欢使用 OUTER JOIN 代替。
我在 Postgres 和 Oracle 中都试过这个查询,结果是一样的。因此,必须是符合标准的结果。NULL 仅在 NOT 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')
)
您可以使用 <> ANY 运算符。您的代码示例:
select
*
from Entity this_
where
(this_.ID <> ANY (null))