将一张表中的JSONB对象数组作为第二张表中的多行插入

时间:2019-01-18 14:56:34

标签: arrays json postgresql jsonb postgresql-9.5

我们正在尝试将数据从包含JSONB的数组列迁移到正确的Postgres表。

{{"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行,但无法弄清楚如何将它们插入第二个表中。在array_to_json情况下,我们可以将数组转换为JSON字符串,但是json_to_recordset似乎不接受来自公共表表达式的JSON字符串。

什么是将JSONB项目数组“镜像”为适当表的好策略,以便我们可以在插入时触发的存储过程中运行查询

1 个答案:

答案 0 :(得分:1)

在横向联接中使用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()。该函数将数组元素返回为value