sql - 如何通过文本列将 JSONB 列与数组连接?

标签 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 的 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/

相关文章:

mysql - 如果父表记录满足条件,则更改子表中的值

json - 在 R 中从 JSON 转换为数据帧

json - 如何通过对象的属性对 json 或 jsonb 值中的数组中的对象进行排序?

java - 为什么 postgresql 不使用正确的顺序?

mysql - 很少使用mysql表中的字段会降低性能吗?

php - 清理用户密码

带有 mysql 的 PHP JSON 输出用于 tag-it

java - 如何将字符串转换为 GUID

sql - 根据 smallint 和 datetime2(7) 的组合计算年份

ruby-on-rails - 在事务脚本中将 ActiveRecord 结果转换为 json