postgresql XOR 加入数组值或 null?

标签 postgresql join

我有两个表,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,如果(且仅当)在给定 BarFoo 中找不到行时,NULL 值将附加到 Foo 的所有列,包括 someArray。这会欺骗 WHERE 条件下的 NULL 检查。

关于postgresql XOR 加入数组值或 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300101/

相关文章:

sql - 查询返回 Object(Builder),未定义的属性

ruby-on-rails - 创建一个无数据库的 rails 模型,作为在 elasticsearch 中索引数据的 View

sql - 员工排类系统

MySQL 查询组合来自多个表的总和

MySQL查看: Join tables without causing the data to duplicate on every row?

postgresql - 如何让 postgres docker 容器在任何连接上使用 scram-sha-256 进行初始化?

postgresql - 错误 42P01。大括号不是问题

php - 为什么这个 mySQL LEFT JOIN 不起作用?它可以是 WHERE 子句吗?

mongodb加入多个集合

基于连接条件的 SQL 删除