考虑到这两个类似的查询:
SELECT EXTRACT(YEAR FROM to_date) AS year_expired
FROM salaries
GROUP BY year_expired
ORDER BY year_expired和
(
SELECT EXTRACT(YEAR FROM to_date) AS year_expired
FROM salaries
WHERE EXTRACT (YEAR FROM to_date) > 1990
GROUP BY year_expired
ORDER BY year_expired
)
UNION
(
SELECT EXTRACT(YEAR FROM to_date) AS year_expired
FROM salaries
WHERE EXTRACT (YEAR FROM to_date) <= 1990
GROUP BY year_expired
ORDER BY year_expired
)第一次查询中的输出在year_expire字段中提供了一个具有空值的行,而在第二个字段中没有空行。
我在问自己为什么会这样。GROUP BY是否也接受空值?我知道UNION将表作为一个集合进行威胁,因此它不会选择重复项。
UNION如何处理空值,以及如何按组处理空值?
编辑:我更改了第二个查询(第二列错误)
EDIT2:谢谢你的回答,但是你能解释一下有什么区别吗?我认为这可能是因为WHERE子句:通过比较,如果我们有一个空值,它就会变得未知,这就是WHERE子句不考虑NULL的原因。
你能告诉我至少如果我说的是发生了什么吗?
PS:我在用PostgresSQL。
发布于 2017-06-09 18:34:54
这与UNION无关。您正在使用NULL子句筛选出WHERE值。
这两个查询并不相同。
发布于 2017-06-20 11:20:38
您在第二个查询中使用比较运算符>,在第二个查询中使用<=,在第一个查询中没有使用筛选器。它不会考虑null > 1990或null <= 1990,并将排除这些记录。
https://stackoverflow.com/questions/44464628
复制相似问题