【问题标题】:Postgres: How to join table with values from jsonb[] columnPostgres:如何使用 jsonb[] 列中的值连接表
【发布时间】:2022-01-18 00:18:46
【问题描述】:

我有两张表如下

accounts
 ------------------------------------------
|  ID  |           LOCATIONS               |
|------------------------------------------|
|  1   |  [{ "id" : 1}, { "id" : 3 }]      |
|------------------------------------------|
|  2   |             []                    |
 ------------------------------------------

regions
 ----------------------------
|  ID  | DATA               |
|---------------------------|
|  1   | {"name": "South"}  |
|---------------------------|
|  2   | {"name": "West"}   |
|---------------------------|
|  3   | {"name": "North"}  |
|---------------------------|
|  4   | {"name": "East"}   |
---------------------------

locations 的类型为 jsonb[]

现在我想得到如下结果

 ------
| NAME |
|------|
| South|
|------|
| North|
 ------

请帮助使用 postgresql 查询以获取此信息。

【问题讨论】:

  • 旁注:JSON 的架构对我来说看起来相当静态。您应该考虑不要滥用 JSON,而是使用关系方式,例如(查找和/或链接)表和列。
  • 列、键和值更多,我只是为了更好地理解而减少了它们。 @stickybit

标签: sql postgresql join jsonb


【解决方案1】:

已编辑jsonb[] 类型:

Demo

select
  r.data ->> 'name' as name
from
  accounts a
  cross join unnest(a.locations) al
  inner join regions r on r.id = (al ->> 'id')::int

P.S:jsonb 输入:

您可以使用jsonb_to_recordset函数和CROSS JOIN将JSON数组记录与表连接起来。

Demo

select
  r.data ->> 'name' as name
from
  accounts a
  cross join jsonb_to_recordset(a.locations) as al(id int)
  inner join regions r on r.id = al.id

【讨论】:

  • 函数 jsonb_array_elements(json[]) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
  • 我为jsonb[] 专栏编辑了我的答案。您应该清楚地告诉您的数据类型结构以获得更好的答案
【解决方案2】:

一种选择是使用JSONB_ARRAY_ELEMENTS() 以及交叉连接,例如

SELECT r.data->>'name' AS "Name"
  FROM accounts AS a,
       regions AS r,
       JSONB_ARRAY_ELEMENTS(a.locations) AS l
 WHERE (value->>'id')::INT = r.id  

Demo PS。如果locations的数据类型是JSON而不是JSONB,那么只需将当前函数替换为JSON_ARRAY_ELEMENTS()

【讨论】:

  • where条件下的值是什么?
  • 函数 jsonb_array_elements(json[]) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
  • 那么您的列是json 类型而不是jsonb。所以,只需将 JSONB_ARRAY_ELEMENTS 替换为 JSON_ARRAY_ELEMENTS @CrazyCat
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 2021-12-16
  • 2017-01-23
  • 2021-03-19
  • 2019-01-23
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多