Postgres:如何使用 jsonb[] 列中的值加入 table

Postgres: How to join table with values from jsonb[] column

我有两个表如下

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 查询以获取此信息。

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 数组记录与 table 连接起来。

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() 以及交叉连接,例如

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()