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
根据 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)
不匹配。
从wirednull GROUP BY COALESCE中选择值(value, id), value;
应该做你想做的事
COALESCE 如果不为 null,则返回第一个值,否则返回第二个值(或者第三个、第四个等,只要前面的值为 null)
group by子句中添加值只是为了让你选择它。
已经有很多答案可以解释它们“为什么”组合在一起,所以这里有一种避免将它们组合在一起的方法。
希望对你有帮助