Postgres:如果两个表中的字段不为空,则加入?

时间:2018-01-12 14:01:14

标签: sql postgresql

我想在Postgres中加入两个表,但前提是两个字段中的值都不是NULL。

对我来说,像这样的查询实际上会表现得像这样,没有进一步的条件:

SELECT * FROM aTable a JOIN bTable b on a.value=b.value;

这不会返回我的数据库中a.valueb.value都为NULL的行。

然而,我并不完全相信我明白发生了什么。这是因为NULL在Postgres中不等于NULL吗?

2 个答案:

答案 0 :(得分:4)

在Postgres中,

NULL不等于NULL,因此您的条件符合您的要求。这是SQL数据库中NULL的定义,因此这适用于所有数据库。无论条件是在where子句,on子句,case表达式还是其他任何地方,都是如此。

如果您希望它们相同,那么您可以在is not distinct from子句中使用on

on a.value is not distinct from b.value

答案 1 :(得分:4)

NULL是一个声明没有值的字段属性。因此,没有任何内容等于NULL,甚至NULL本身。如果您想加入NULL,则必须使用函数。

你可以尝试几件事:

-- be sure `escape value` doesn't normally occur in the column to avoid surprises
on coalesce(a.value, 'escape value') = coalesce(b.value, 'escape value')

-- no need for escape values, but more difficult to read
on (a.value is null and b.value is null) or a.value = b.value

-- even more text, but intent is more clear (at least to me)
on case
    when a.value is null and b.value is null then TRUE
    when a.value = b.value then TRUE
    else FALSE
end