Arrays 将一个表中的JSONB对象数组作为第二个表中的多行插入
我们正在尝试将数据从包含JSONB的数组列迁移到适当的Postgres表Arrays 将一个表中的JSONB对象数组作为第二个表中的多行插入,arrays,json,postgresql,jsonb,postgresql-9.5,Arrays,Json,Postgresql,Jsonb,Postgresql 9.5,我们正在尝试将数据从包含JSONB的数组列迁移到适当的Postgres表 {{"a":1,"b": 2, "c":"bar"},{"a": 2, "b": 3, "c":"baz"}} 作为该过程的一部分,我们已经尝试了几次使用函数,如unest和array\u to\u json。在最不寻常的情况下,我们得到了几个JSONB行,但无法确定如何将它们插入到第二个表中。在array\u to_json案例中,我们可以将数组强制转换为json字符串,但是json\u to_记录集似乎不接受来自公共
{{"a":1,"b": 2, "c":"bar"},{"a": 2, "b": 3, "c":"baz"}}
作为该过程的一部分,我们已经尝试了几次使用函数,如unest
和array\u to\u json
。在最不寻常的情况下,我们得到了几个JSONB行,但无法确定如何将它们插入到第二个表中。在array\u to_json
案例中,我们可以将数组强制转换为json字符串,但是json\u to_记录集
似乎不接受来自公共表表达式的json字符串
将JSONB项数组“镜像”为适当的表,以便我们可以在插入时触发的存储过程内部运行查询,这是一个好策略吗?在横向联接中使用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()
。函数以值的形式返回数组元素
表的结构(列的数量、名称和类型)已知吗?是的,我们定义了第二个具有正确数据类型的表,并根据文档提供了到json_to_记录集
调用的模式映射。经过进一步搜索,下面看起来很相关,虽然我不完全理解为什么要使用“交叉连接横向”Ok,但我认为没有人可以使用像jsonb[]
这样奇怪的结构。这绝对是一种反模式。另请参见:谢谢您的反馈。我会尽快尝试你的建议。
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