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[]
类型编辑:
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 连接起来。
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()
我有两个表如下
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[]
类型编辑:
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 连接起来。
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()