如何在列包含空值

时间:2016-12-13 18:44:37

标签: postgresql

对于两个表,我想比较一组给定的列(下面的例子中有两个,但可能更多),看看它们的值是否相同。

我遇到的问题是当列包含空值时(在下面的示例中,我指的是var_1var_2何时包含空值)。在这个例子中,一列是日期格式,另一列是字符,但是这可能会有所不同,我试图避免一个涉及用一些值填充空值的解决方案。

考虑到列数可以变化,我理想地喜欢一种解决方案,它可以计算不匹配的行或每行返回一个结果。

我首先在下面尝试过......

SELECT SUM(a.var_1 = b.var_1, a.var_2 = b.var_2) AS result
FROM table_1 a
INNER JOIN table_2 b USING (key) 

...但与其他SO posts一样,您无法汇总布尔值。

然后尝试了一种加入方法,以检查加入前后的行号...

SELECT COUNT(*)
FROM table_1 a
INNER JOIN table_2 b 
        ON a.key = b.key  
       AND a.var_1 = b.var_1
       AND a.var_2 = b.var_2

...但这只会加入非空值。

最后尝试每行检查一次

SELECT (a.var_1 = b.var_1) = (a.var_2 = b.var_2) AS result
FROM table_1 a
INNER JOIN table_2 b USING (key)

...但是当行中存在空值时,结果为空。

对于更好的方法的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以使用is not distinct from

SELECT COUNT(*)
FROM table_1 a
  JOIN table_2 b 
    ON a.key = b.key  
   AND (a.var_1, a.var_2) is not distinct from (b.var_1, b.var_2);

如果您想比较表格中的所有列,可以将其简化为:

SELECT COUNT(*)
FROM table_1 a
  JOIN table_2 b 
    ON a is not distinct from b;

答案 1 :(得分:1)

这是你想要的吗?

SELECT SUM( (a.var_1 is not distinct from b.var_1 AND a.var_2 is not distinct from b.var_2)::int) AS result
FROM table_1 a INNER JOIN
     table_2 b
     USING (key) ;

ANSI标准的Postgres运算符is not distinct from是一个(相当冗长的)NULL - 安全等式运算符。也就是说,如果两个值为NULL,则返回true而不是NULL