给定这两个类似的查询:
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
字段中提供具有 NULL 值的行,而在第二个查询中没有 NULL 行。
您可以在此处查看示例。
我在问自己为什么会这样。GROUP BY
是否也采用 NULL 值?我知道 UNION 威胁表作为一个集合,因此它不会选择重复项。
UNION 如何处理 NULL 值,GROUP BY 如何处理 NULL 值?
编辑:我更改了第二个查询(第二列是错误的(
编辑2:感谢您的回答,但您能解释一下有什么区别吗?我认为这可能是因为 WHERE 子句:通过比较,如果我们有一个 NULL 值,它就会变得未知,这就是为什么 WHERE 子句不考虑 NULL 的原因。
你能告诉我至少我说的是不是发生了什么吗?
PS:我正在使用PostgresSQL。
UNION
无关。 您将使用 WHERE
子句筛选出NULL
值。
这两个查询并不相同。
您在第二个查询中使用比较运算符 >
,<=
,在第一个查询中使用没有筛选器。它不会考虑null > 1990
或null <= 1990
,并将排除这些记录。