数组值上的postgresql XOR联接还是null?
我有两个表,Foo和Bar,我想把它们连接在一起,这样BarID就可以根据数组中有一个键来获得奖品,或者如果没有设置数组,它的默认值就好像每个键都可以解锁奖品一样数组值上的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
>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)