鉴于这两个类似的查询:
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值?
编辑:我更改了第二个查询(第二列错误)
EDIT2:感谢您的回答,但您能解释一下有什么区别吗? 我认为这可能是因为WHERE CLAUSE:如果我们有一个NULL值,它会变成UNKNOWN,这就是WHERE子句没有考虑NULL的原因。
你能告诉我至少我所说的是会发生什么吗?
PS:我正在使用PostgresSQL。
答案 0 :(得分:3)
这与UNION
无关。您正使用NULL
子句过滤掉WHERE
值。
两个查询不完全相同。
答案 1 :(得分:0)
您在第二个查询中使用比较运算符@xw.func
def double_sum(x, y):
"""Returns twice the sum of the two arguments"""
return 2 * (x + y)
def main():
# To run this with the debug server, set UDF_DEBUG_SERVER = True in the xlwings VBA module
xw.serve()
if __name__ == '__main__':
main()
,>
,在第一个查询中没有过滤器。它不会考虑<=
或null > 1990
,并会排除这些记录。