gpt4 book ai didi

postgresql - Postgres 在 WHERE id != int 查询中排除 NULL

转载 作者:行者123 更新时间:2023-11-29 11:13:04 24 4
gpt4 key购买 nike

昨天,当我试图从统计表中过滤掉用户 ID 时,我在 Postgres 中遇到了一个奇怪的问题。例如,当我们这样做时,user_id != 24,postgres 也会排除 user_idNULL 的行。

我创建了以下显示相同结果的测试代码。

CREATE TEMPORARY TABLE test1 (
id int DEFAULT NULL
);

INSERT INTO test1 (id) VALUES (1), (2), (3), (4), (5), (2), (4), (6),
(4), (7), (5), (9), (5), (3), (6), (4), (3), (7),
(NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL);

SELECT COUNT(*) FROM test1;

SELECT id, COUNT(*) as count
FROM test1
GROUP BY id;

SELECT id, COUNT(*) as count
FROM test1
WHERE id != 1
GROUP BY id;

SELECT id, COUNT(*) as count
FROM test1
WHERE (id != 1 OR id IS NULL)
GROUP BY id;

第一个查询只计算所有行。第二个计算每个值的数量,包括空值。第三个排除值 1 以及所有空值。第四个是排除值 1 并仍然包含空值的解决方法。

对于我尝试使用此查询的目的,应始终包含空值。

变通是解决这个问题的唯一方法吗?这是预期的 Postgres 行为吗?

最佳答案

您的“变通办法”是通常的做法。一切都按预期运行。

原因很简单:空值既不等于也不不等于任何东西。当您认为 null 表示“未知”时,这是有道理的,并且与未知值进行比较的真实性也是未知的。

推论是:

  • null = null 不成立
  • null = some_value 不正确
  • null != some_value 不是真的

存在两个特殊比较 IS NULLIS NOT NULL 来处理列是否为 null 的测试。没有其他与 null 的比较是正确的。

关于postgresql - Postgres 在 WHERE id != int 查询中排除 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com