使用 PostgreSQL 9.6+
两个表(简化为仅与示例数据相关的列):
表 1:
-------------------------------------------------------
key (PK) [Text]| resources [JSONB]
-------------------------------------------------------
asdfaewdfas | [i0c1d1233s49f3fce, z0k1d9921s49f3glk]
表 2:
-------------------------------------------------------
resource (PK) [Text]| data [JSONB]
-------------------------------------------------------
i0c1d1233s49f3fce | {large json of data}
z0k1d9921s49f3glk | {large json of data}
尝试从表 1 的 resources
列访问表 2 的 data
列。
最佳答案
解除 JSON 数组的嵌套并连接到第二个表。喜欢:
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
中具有空/null/不匹配资源的所有行:
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
连接。请参阅:
考虑采用带有连接表的规范化数据库设计,每个链接资源一行而不是列 table1.resources
,从而正确实现 m:n 关系。通过这种方式,您可以使用关系功能强制引用完整性、数据完整性等。并且查询变得更简单。 jsonb
一切都很简单一开始。但如果您经常使用嵌套数据,这可能会对您产生不利影响。
关于sql - 如何通过文本列将 JSONB 列与数组连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51655631/