我们正在尝试将数据从包含JSONB的数组列迁移到正确的Postgres表。
{{"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行,但无法弄清楚如何将它们插入第二个表中。在array_to_json
情况下,我们可以将数组转换为JSON字符串,但是json_to_recordset
似乎不接受来自公共表表达式的JSON字符串。
什么是将JSONB项目数组“镜像”为适当表的好策略,以便我们可以在插入时触发的存储过程中运行查询?
答案 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
。