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

Postgresql:如何用n步对组中的记录进行排序

遍历postgresql中的json数组元素

如何在 Postgresql 中获取数组的 JavaScript/JSON 数组?

当文本是希伯来语时,无法构造 PostgreSQL 数组文字