将一个 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"

作为该过程的一部分,我们使用 unnestarray_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.