昨天,当我试图从统计表中过滤掉用户 ID 时,我在 Postgres 中遇到了一个奇怪的问题。例如,当我们这样做时user_id != 24
,postgres 也排除了 where 的user_id
行NULL
。
我创建了以下显示相同结果的测试代码。
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 行为吗?