Postgresql 遍历一个数组字段并将记录用于另一个查询
Posted
技术标签:
【中文标题】Postgresql 遍历一个数组字段并将记录用于另一个查询【英文标题】:Postgresql Iterate over an array field and use the records for another query 【发布时间】:2015-06-17 20:58:06 【问题描述】:我正在尝试遍历数组字段,以便将每条记录用作 用于查询并最终加入所有结果的参数,但我需要帮助才能获得它。
我有一个表,其中包含一个名为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。
【问题讨论】:
【参考方案1】:如果您的查询引发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)
【讨论】:
【参考方案2】:由于fleets
是一个数组列,因此您有几个选项。
要么直接使用ANY
构造(不需要unnest()
):
SELECT * FROM vehicles
WHERE fleet_fk = ANY(SELECT fleets FROM auth_user WHERE id = 4);
或者重写为join:
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
有 两种实现。
ANY
for sets
ANY
for arrays
野兽的行为基本相同,只是喂食方式不同。
数据库设计
考虑规范化数据库架构中隐藏的多对多(或一对多?)关系:
How to implement a many-to-many relationship in PostgreSQL?【讨论】:
以上是关于Postgresql 遍历一个数组字段并将记录用于另一个查询的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历保存到 JSONObject 的数据数组并将其放入 JSONArray?
将数据解析为 Vec<T> 并将向量插入 postgresql