SQL:处理NULL值(联合)

时间:2017-06-09 18:33:33

标签: sql database postgresql null union

鉴于这两个类似的查询:

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行。

You can see the example here.

我问自己为什么会这样。 GROUP BY是否也采用NULL值? 我知道UNION威胁表作为一个集合,因此它不会选择重复。

UNION如何处理NULL值,GROUP BY如何处理NULL值?

编辑:我更改了第二个查询(第二列错误)

EDIT2:感谢您的回答,但您能解释一下有什么区别吗? 我认为这可能是因为WHERE CLAUSE:如果我们有一个NULL值,它会变成UNKNOWN,这就是WHERE子句没有考虑NULL的原因。

你能告诉我至少我所说的是会发生什么吗?

PS:我正在使用PostgresSQL。

2 个答案:

答案 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,并会排除这些记录。