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

Postgresql对数组字段进行迭代,并将记录用于另一个查询,sql,arrays,postgresql,many-to-many,Sql,Arrays,Postgresql,Many To Many,我试图迭代一个数组字段,以便使用每个记录作为 一个用于查询并最终连接所有结果的参数,但我需要帮助才能获得它 我有一个带有数组字段的表,名为fleets,它可以有一个或多个值,即{1,2,3},我需要迭代每个值以获得属于这些车队的所有车辆 通过一个子查询,我得到了3行,其中包含这些值1,2,3 SELECT * FROM vehicles WHERE fleet_fk=( SELECT unnest(fleets) FROM auth_user WHERE id=4) 我正在使用Postg

我试图迭代一个数组字段,以便使用每个记录作为 一个用于查询并最终连接所有结果的参数,但我需要帮助才能获得它

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

通过一个子查询,我得到了3行,其中包含这些值
1
2
3

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

我正在使用PostgreSQL 9.4。

如果您的查询引发
错误:子查询返回的多行用作表达式,这意味着您应该使用:


由于
fleets
是一个数组列,因此您有两个选项

直接使用
ANY
构造(无需):

或重写为加入:

SELECT v.*
FROM   auth_user a
JOIN   vehicles  v ON v.fleet_fk = ANY(a.fleets)
WHERE  a.id = 4;
或者您可以
unnest()
,这样您就不再需要
任何

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\u user
中没有另一列名为
fleet\u fk
。在这种情况下,对连接使用更明确的
ON
子句以避免歧义

请注意,对于
ANY
,有两种实现

野兽的行为基本上是一样的,只是喂养它们的方式不同而已

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

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