Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将一个表中的JSONB对象数组作为第二个表中的多行插入_Arrays_Json_Postgresql_Jsonb_Postgresql 9.5 - Fatal编程技术网

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

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_记录集似乎不接受来自公共

我们正在尝试将数据从包含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_记录集
似乎不接受来自公共表表达式的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