对于两个表,我想比较一组给定的列(下面的例子中有两个,但可能更多),看看它们的值是否相同。
我遇到的问题是当列包含空值时(在下面的示例中,我指的是var_1
和var_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)
...但是当行中存在空值时,结果为空。
对于更好的方法的任何帮助将不胜感激。
答案 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
。