为什么 postgres 对空值进行分组?

问题描述 投票:0回答:2
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;

返回一行,但我希望返回两行

SELECT * 
FROM wirednull a 
LEFT JOIN wirednull b 
  ON (a.value = b.value)

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

postgresql group-by null
2个回答
3
投票

根据 SQL 维基百科 :

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

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

这不是问题:

因为

null = null
something = null
返回
unknown
而不是
true/false

所以:

ON (a.value = b.value)

不匹配。


0
投票

从wirednull GROUP BY COALESCE中选择值(value, id), value;

应该做你想做的事

COALESCE 如果不为 null,则返回第一个值,否则返回第二个值(或者第三个、第四个等,只要前面的值为 null)

group by子句中添加值只是为了让你选择它。

已经有很多答案可以解释它们“为什么”组合在一起,所以这里有一种避免将它们组合在一起的方法。

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.