昨天我在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;

第一个查询只对所有行进行计数.

对于我试图使用此查询的内容,应该始终包含null值.

这是唯一的办法吗?这是预期的研究生行为吗?

推荐答案

你的"变通"是通常的做法.一切正常.

原因很简单:null既不等于也不等于任何东西.当你认为NULL意味着"未知"时,这是有意义的,并且与未知值的比较的真相也是未知的.

其推论是:

  • null = null不是真的
  • null = some_value不是真的
  • null != some_value不是真的

存在两个特殊比较IS NULLIS NOT NULL,用于测试列是否为null.与null的其他比较不能为真.

Postgresql相关问答推荐

PostgreSQL数据文件是否仅在判断点期间写入磁盘?

如何使用postgr sql regex删除重复项和inc表记录

如何在PostgreSQL 16中设置&Q;VARSIZE&Q;和&Q;SET_VARSIZE&Q;

是否可以在psql查询输出中删除新行末尾的+号?

是否从表中 Select 值?巴什

PostgreSQL无效语法

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

如何将 NULL 值插入 UUID 而不是零

如何展平也在关系中使用的区分大小写的列

PG::UndefinedTable:错误:relation "active_storage_blobs" does not exist

Nodemon - 安装期间clean exit - waiting for changes before restart

Windows PSQL 命令行: is there a way to allow for passwordless login?

INSERT RETURNING 是否保证以 right的顺序返回?

如何查询存储在数组中的 Rails ActiveRecord 数据

如何正确索引多对多关联表?

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

向 Postgres 整数数组添加值

每个数据库提供程序类型允许的最大参数数是多少?

判断 Postgres 中是否存在序列(plpgsql)