将一个 table 中的 JSONB 对象数组作为第二个 table 中的多行插入
Insert array of JSONB objects from one table as multiple rows in second table
我们正在尝试将数据从包含 JSONB 的数组列迁移到适当的 Postgres table。
{{"a":1,"b": 2, "c":"bar"},{"a": 2, "b": 3, "c":"baz"}}
a | b | c
---+---------+---
1 | 2 | "bar"
2 | 3 | "baz"
作为该过程的一部分,我们使用 unnest
和 array_to_json
等函数进行了多次尝试。在不嵌套的情况下,我们得到了几个 JSONB 行,但不知道如何将它们插入到第二个 table 中。在 array_to_json
的情况下,我们可以将数组转换为 JSON 字符串,但是 json_to_recordset
似乎不接受来自普通 [=29] 的 JSON 字符串=] 表达式.
有什么好的策略可以'mirror' JSONB 项的数组作为适当的 table,这样我们就可以 运行存储过程中的查询,在 insert?
时触发
在横向连接中使用 unnest()
:
with my_data(json_column) as (
values (
array['{"a":1,"b":2,"c":"bar"}','{"a":2,"b":3,"c":"baz"}']::jsonb[])
)
select
value->>'a' as a,
value->>'b' as b,
value->>'c' as c
from my_data
cross join unnest(json_column) as value
a | b | c
---+---+-----
1 | 2 | bar
2 | 3 | baz
(2 rows)
您可能需要一些转换或转换,例如:
select
(value->>'a')::int as a,
(value->>'b')::int as b,
(value->>'c')::text as c
from my_data
cross join unnest(json_column) as value
横向连接意味着函数 unnest()
将针对主 table 的每一行执行。函数returns数组的元素为value
.
我们正在尝试将数据从包含 JSONB 的数组列迁移到适当的 Postgres table。
{{"a":1,"b": 2, "c":"bar"},{"a": 2, "b": 3, "c":"baz"}}
a | b | c
---+---------+---
1 | 2 | "bar"
2 | 3 | "baz"
作为该过程的一部分,我们使用 unnest
和 array_to_json
等函数进行了多次尝试。在不嵌套的情况下,我们得到了几个 JSONB 行,但不知道如何将它们插入到第二个 table 中。在 array_to_json
的情况下,我们可以将数组转换为 JSON 字符串,但是 json_to_recordset
似乎不接受来自普通 [=29] 的 JSON 字符串=] 表达式.
有什么好的策略可以'mirror' JSONB 项的数组作为适当的 table,这样我们就可以 运行存储过程中的查询,在 insert?
时触发在横向连接中使用 unnest()
:
with my_data(json_column) as (
values (
array['{"a":1,"b":2,"c":"bar"}','{"a":2,"b":3,"c":"baz"}']::jsonb[])
)
select
value->>'a' as a,
value->>'b' as b,
value->>'c' as c
from my_data
cross join unnest(json_column) as value
a | b | c
---+---+-----
1 | 2 | bar
2 | 3 | baz
(2 rows)
您可能需要一些转换或转换,例如:
select
(value->>'a')::int as a,
(value->>'b')::int as b,
(value->>'c')::text as c
from my_data
cross join unnest(json_column) as value
横向连接意味着函数 unnest()
将针对主 table 的每一行执行。函数returns数组的元素为value
.