25

我在这个查询中使用 Postgres

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

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

(this_.ID not in (1))

我得到了预期的结果

4

7 回答 7

30

的结果[not] in (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)
于 2013-07-26T09:36:47.003 回答
12

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

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

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

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

不能满足,因为空值可以是任何值。

于 2013-07-26T11:31:57.337 回答
3

回答

解决方案已在此答案中发布,我的解决方案几乎相同:

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 和 NULL

这是一个优秀的 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是一个操作数,那么结果是nulland 在布尔上下文中(例如,在WHERE-clauses 中) - 它是falsey。虽然,falseyfalse不同,并且NOT (1=NULL)是 NULL,但不是truly,所以这两个请求都返回 0 行:

-- 1
select 1 where (1 = null)
-- 2
select 1 where NOT (1 = null)

我希望它有用

于 2021-09-01T09:35:05.777 回答
1
select * 
from Entity this_ 
where (this_.ID not in (null))

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

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

并且您的选择将不包含空值

于 2018-07-02T13:44:58.443 回答
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 条件下才会以这种方式运行。

于 2019-07-05T16:44:01.517 回答
0

我遇到过类似问题,最终想出了以下解决方案;

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')
        )
于 2019-04-19T12:53:08.703 回答
-1

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

select 
  * 
from Entity this_ 
where 
   (this_.ID <> ANY (null))
于 2018-11-12T14:33:29.900 回答