为什么 postgres 将空值分组?

wut*_*aer 5 postgresql null group-by

CREATE TEMP TABLE wirednull (
    id bigint NOT NULL,
    value bigint,
    CONSTRAINT wirednull_pkey PRIMARY KEY (id)
);
INSERT INTO wirednull (id,value) VALUES (1,null);
INSERT INTO wirednull (id,value) VALUES (2,null);

SELECT value FROM wirednull GROUP BY value;
Run Code Online (Sandbox Code Playgroud)

返回一行,但我希望有两行,因为

SELECT * 
FROM wirednull a 
LEFT JOIN wirednull b 
  ON (a.value = b.value)
Run Code Online (Sandbox Code Playgroud)

没有找到任何连接,因为在 postgres 中 null!=null

Jua*_*eza 3

根据SQL 维基百科

当两个空值相等时:分组、排序和一些集合操作

由于 SQL:2003 将所有 Null 标记定义为彼此不相等,因此需要一种特殊的定义,以便在执行某些操作时将 Null 分组在一起。SQL 将“任何两个彼此相等的值或任何两个 Null”定义为“不不同”。[20] 当使用 GROUP BY 子句(以及执行分组的其他关键字)时,这种 not unique 的定义允许 SQL 对 Null 进行分组和排序。

这不是问题:

因为null = null或者something = null返回unknowntrue/false

所以:

ON (a.value = b.value)
Run Code Online (Sandbox Code Playgroud)

不匹配。