【发布时间】:2019-01-17 13:00:34
【问题描述】:
昨天我在 Postgres 中尝试从统计表中过滤掉用户 ID 时遇到了一个奇怪的问题。例如,当我们这样做时,user_id != 24,postgres 也排除了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 行为吗?
【问题讨论】:
标签: postgresql null where