我想在Postgres中加入两个表,但前提是两个字段中的值都不是NULL。
对我来说,像这样的查询实际上会表现得像这样,没有进一步的条件:
SELECT * FROM aTable a JOIN bTable b on a.value=b.value;
这不会返回我的数据库中a.value
和b.value
都为NULL的行。
然而,我并不完全相信我明白发生了什么。这是因为NULL
在Postgres中不等于NULL
吗?
答案 0 :(得分:4)
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