带有可选输入参数的PostgreSQL左连接查询

nukf8bse  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我有一个数据库模式,其中我有三个表A,B和C,其中A的主键ID是B和C的外键。我给出了一个条件,在该条件下,我应该查询A的一列,给定列B和C的一些值。
总结一下

A has two fields id and name
   B has two fields id and age 
   C has two fields id and gender

我正在尝试设计一个查询,它将执行以下操作

`select * from A 
Left join B on B.id = A.id and b.age = $1 
Left join C on C.id = A.id and c.gender = $2;`

这里$1和$2来自Rust中的外部程序,可以为null。问题是即使我向这些查询传递有效的输入,过滤结果也是不正确的。
有没有更简单的方法来执行这个查询,使得Join 1只在$1不为null时发生,Join 2只在$2不为null时发生。

`select * from A 
Left join B on B.id = A.id and b.age = $1 
Left join C on C.id = A.id and c.gender = $2;`

我尝试了上面的查询,但结果不是预期的。

6jjcrrmo

6jjcrrmo1#

通过“Join 1 only occurs when $1 is not null and Join 2 only occurs when $2 is not null”,我假设所需的行为是仅当相关参数非NULL时才按年龄或性别过滤结果。我从LEFT JOIN的使用中推断,并不是表A中的每一行都需要在表B或表C中有对应的行,因此,年龄或性别可能是未知的。结果应该只包括已知与提供的参数匹配的行,还是应该包括年龄或性别未知的行?下面将讨论这两种情况。
以下查询返回已知与提供的参数匹配的所有行:

SELECT A.id, A.name, B.age, C.gender
  FROM A
    LEFT JOIN B ON B.id = A.id
    LEFT JOIN C ON C.id = A.id
  WHERE ($1 IS NULL OR B.age = $1)
    AND ($2 IS NULL OR C.gender = $2)

如果结果应该包括未知年龄或性别沿着已知匹配,则可以使用以下查询:

SELECT A.id, A.name, B.age, C.gender
  FROM A
    LEFT JOIN B ON B.id = A.id
    LEFT JOIN C ON C.id = A.id
  WHERE ($1 IS NULL OR B.age = $1 OR B.age IS NULL)
    AND ($2 IS NULL OR C.gender = $2 OR C.gender IS NULL)

相关问题