我有两个表,Foo 和 Bar,我想将它们连接在一起,以便 BarID 根据数组中的键获得奖励,或者如果没有设置数组,它默认为每个键解锁奖品。
>Table Foo
fooID | someArray | prize
----------------------------------
1 | {10,20,30} | 'Winner'
2 | {10} | 'Grand prize'
3 | null | 'Participant'
(这不是 someArray 的字符串,它是一个有效的 postgresql type 。)
>Table Bar
BarID | Key
------------
1 | 10
2 | 20
3 | 30
4 | 40
5 | 40
6 | 40
我已经在下面尝试过:
SELECT
Foo.fooID,
Bar.prize
FROM Foo
LEFT JOIN Bar ON Bar.Key = ANY(someArray)
当我放入诸如
的 WHERE 子句时,我的成功率很小WHERE Bar.BarID = 3
我的结果只是“获胜者”,但我也想获得“参与者”。如果我将 WHERE 设置为包含空值:
WHERE
Bar.BarID = 3
OR
Foo.someArray = null
我仍然没有得到空值。
没有 where 子句返回值的所有组合,包括空值。
我不太确定如何获得我想要的这种行为。我可以获取所有值,也可以只获取一组值,但不能同时获取两者。
举个例子,如果我要为 BarID = 1 进行连接,我应该得到“Winner”、“Grand prize”和“participant”。如果我选择 BarID 5,我只会得到参与者。
最佳答案
尝试:
Foo.someArray IS NULL
当应用于 NULL
值时,相等运算符总是产生 NULL
,而不是 TRUE
。要测试列是否包含 NULL
值,您需要上述表达式,而不是 。Foo.someArray = NULL
More about that in the manual .
您还必须将它放在 JOIN
条件中,而不是像@Michael 评论的那样放在 WHERE
子句中。喜欢:
LEFT JOIN Bar ON Bar.Key = ANY(Foo.someArray) OR Foo.someArray IS NULL
如果将它放在 WHERE
子句中,您可能还会发现 Foo.someArray IS NOT NULL
的行,但有不同的奖品。对于 LEFT JOIN
,如果(且仅当)在给定 Bar
的 Foo
中找不到行时,NULL
值将附加到 Foo
的所有列,包括 someArray
。这会欺骗 WHERE
条件下的 NULL
检查。
关于postgresql XOR 加入数组值或 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300101/