数组值上的postgresql XOR联接还是null?

数组值上的postgresql XOR联接还是null?,postgresql,join,Postgresql,Join,我有两个表,Foo和Bar,我想把它们连接在一起,这样BarID就可以根据数组中有一个键来获得奖品,或者如果没有设置数组,它的默认值就好像每个键都可以解锁奖品一样 >Table Foo fooID | someArray | prize ---------------------------------- 1 | {10,20,30} | 'Winner' 2 | {10} | 'Grand prize' 3 | null

我有两个表,Foo和Bar,我想把它们连接在一起,这样BarID就可以根据数组中有一个键来获得奖品,或者如果没有设置数组,它的默认值就好像每个键都可以解锁奖品一样

>Table Foo
fooID | someArray    | prize
----------------------------------
 1    | {10,20,30}   | 'Winner'
 2    | {10}         | 'Grand prize'
 3    | null         | 'Participant'
(这不是someArray的字符串,它是有效的。)

我在下面尝试过:

SELECT
    Foo.fooID,
    Bar.prize
FROM Foo
LEFT JOIN Bar ON Bar.Key = ANY(someArray)
当我在WHERE子句中添加诸如

WHERE Bar.BarID = 3
我的结果只是“赢家”,但我也想得到“参与者”。如果我设置了包含空值的位置:

WHERE 
    Bar.BarID = 3
  OR
    Foo.someArray = null
我仍然没有得到我的空值

No where子句返回所有值的组合,包括空值

我真的不知道怎样才能得到我想要的这种行为。我可以得到所有的,或者我只能得到一组值,但不能同时得到两个值

举个例子,如果我为BarID=1进行连接,我应该获得“获胜者”、“大奖”和“参与者”。如果我选择BarID 5,我只会得到参与者。

试试:

Foo.someArray IS NULL
当应用于
NULL
值时,相等运算符总是产生
NULL
,而不是
TRUE
。要测试列是否包含
NULL
值,您需要上面的表达式,而不是
Foo.someArray=NULL

您还必须将其放入您的
JOIN
条件中,而不是@Michael评论的
WHERE
子句中。比如:

LEFT JOIN Bar ON Bar.Key = ANY(Foo.someArray) OR Foo.someArray IS NULL
如果将其放在
WHERE
子句中,还可能会找到
Foo.someArray不是NULL的行,但有不同的奖品。使用
左联接
,如果(且仅当)在给定的
Foo
中找不到行,则
NULL
值将附加到
Foo
的所有列,包括
someArray
。这将愚弄在
WHERE
条件下检查
NULL

试试看

ON COALESCE(Bar.Key = ANY(someArray),TRUE)

没错,不过我不确定这种改变是否会产生预期的结果。如果我明白了想要的结果是什么,@MichaelKrelin hacker:说得好。我相应地修改了我的答案,并添加了一些相关信息。这个表达式带有(理论)缺陷,如果
Bar.Key
为空,它也会产生TRUE,这不是我们想要的。
ON COALESCE(Bar.Key = ANY(someArray),TRUE)