如何通过文本列将JSONB列与数组联接?

时间:2018-08-02 14:05:01

标签: sql json postgresql jsonb postgresql-9.6

使用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的data列访问表2的resources列。

1 个答案:

答案 0 :(得分:2)

取消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中的所有行:

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首先是简单的 。但是,如果您处理大量嵌套数据,则可能会麻烦您。