如何通过文本列加入带有数组的 JSONB 列?

How to JOIN a JSONB column with an array by a text column?

使用 PostgreSQL 9.6+

两个表(简化为仅与示例数据相关的列):

Table 1:

-------------------------------------------------------
key (PK) [Text]| resources [JSONB]
-------------------------------------------------------
asdfaewdfas    | [i0c1d1233s49f3fce, z0k1d9921s49f3glk]

Table 2:

-------------------------------------------------------
resource (PK) [Text]| data [JSONB]
-------------------------------------------------------
i0c1d1233s49f3fce   | {large json of data}
z0k1d9921s49f3glk   | {large json of data}

正在尝试从 Table 1 的 resources 列访问 Table 2 的 data 列。

取消 JSON 数组的嵌套并加入第二个 table。喜欢:

SELECT t1.*, t2.data -- or just the bits you need
FROM   table1 t1, jsonb_array_elements_text(t1.resources) r(resource)
JOIN   table2 t2 USING (resource)
WHERE  t1.key = ?

或者,使用空/空/不匹配的资源保留 table1 中的所有行:

SELECT t1.*, t2.data -- or just the bits you need
FROM   table1 t1
LEFT   JOIN LATERAL jsonb_array_elements_text(t1.resources) r(resource) ON true
LEFT   JOIN table2 t2 USING (resource)
WHERE  t1.key = ?

关于jsonb_array_elements_text()

第一个查询中有一个隐式 LATERAL 连接。参见:

考虑一个规范化的数据库设计,其连接点 table 每个链接资源一行而不是列 table1.resources,正确实现 m:n 关系。通过这种方式,您可以使用关系功能强制执行参照完整性、数据完整性等。查询变得更简单。 jsonb因为一切都很简单一开始。但是,如果您经常使用嵌套数据,这可能会影响您。

  • Can PostgreSQL array be optimized for join?
  • How to implement a many-to-many relationship in PostgreSQL?
  • Can PostgreSQL have a uniqueness constraint on array elements?