如何通过文本列加入带有数组的 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?
使用 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?