Postgresql 迭代数组字段并将记录用于另一个查询

Postgresql Iterate over an array field and use the records for another query

我正在尝试遍历数组字段以便将每条记录用作 查询并最终加入所有结果的参数,但我需要帮助才能获得它。

我有一个 table,它有一个名为 fleets 的数组字段,它可以有一个或多个值,即。 {1,2,3} 我需要遍历每个值以获得属于这些车队的所有车辆。

通过子查询,我得到 3 行这些值 123

SELECT * FROM vehicles WHERE fleet_fk=(
   SELECT unnest(fleets) FROM auth_user WHERE id=4)

我正在使用 PostgreSQL 9.4。

如果您的查询引发 ERROR: more than one row returned by a subquery used as an expression,这意味着您应该使用 ANY:

SELECT * FROM vehicles 
WHERE fleet_fk = ANY(
   SELECT unnest(fleets) FROM auth_user WHERE id=4)

由于 fleets 是一个数组列,您有几个选择。

要么直接使用ANY构造(不需要unnest()):

SELECT * FROM vehicles 
WHERE fleet_fk = ANY(SELECT fleets FROM auth_user WHERE id = 4);

或重写为连接:

SELECT v.*
FROM   auth_user a
JOIN   vehicles  v ON v.fleet_fk = ANY(a.fleets)
WHERE  a.id = 4;

或者你可以unnest(),那么你就不需要ANY了:

SELECT v.*
FROM   auth_user a
     , unnest(a.fleets) fleet_fk   -- implicit LATERAL join
JOIN   vehicles  v USING (fleet_fk)
WHERE  a.id = 4;

这是假设您在 auth_user 中没有另一个名为 fleet_fk 的列。在这种情况下,为连接使用更明确的 ON 子句以避免歧义。

请注意 两个实现 ANY

野兽的行为基本上是一样的,只是喂养不同而已。

数据库设计

考虑规范化数据库模式中隐藏的多对多(或一对多?)关系:

  • How to implement a many-to-many relationship in PostgreSQL?