在 postgres 中展平 JSONB 数组
Flattening JSONB array in postgres
我正在使用 Postgres 9.4 并将我的数据存储为 JSONB 数组。我正在寻找一种方法来提取数组中的 json 元素,并使用 psql 将它们替换为一个串联的 json 元素。考虑以下 table 的示例:
'aaa' | [{"a":"foo"},{"b":"bar"},{"c":["baz", 'boom']}] | 404
'bbb' | [{"bar":"foo"}] | 501
我希望实现的目标是:
'aaa' | {"a":"foo", "b":"bar", "c":["baz", "boom"]} | 404
'bbb' | {"bar":"foo"} | 501
我尝试使用 json 类型的内置 postgres 函数来实现它。但我只是想出了如何在确切位置提取元素。
提前致谢。
SELECT id, jo.obj
FROM mytable
CROSS JOIN
LATERAL
(
SELECT JSON_OBJECT_AGG(jt.key, jt.value) obj
FROM JSONB_ARRAY_ELEMENTS(data) je
CROSS JOIN
LATERAL JSONB_EACH(je.value) jt
) jo
我正在使用 Postgres 9.4 并将我的数据存储为 JSONB 数组。我正在寻找一种方法来提取数组中的 json 元素,并使用 psql 将它们替换为一个串联的 json 元素。考虑以下 table 的示例:
'aaa' | [{"a":"foo"},{"b":"bar"},{"c":["baz", 'boom']}] | 404
'bbb' | [{"bar":"foo"}] | 501
我希望实现的目标是:
'aaa' | {"a":"foo", "b":"bar", "c":["baz", "boom"]} | 404
'bbb' | {"bar":"foo"} | 501
我尝试使用 json 类型的内置 postgres 函数来实现它。但我只是想出了如何在确切位置提取元素。 提前致谢。
SELECT id, jo.obj
FROM mytable
CROSS JOIN
LATERAL
(
SELECT JSON_OBJECT_AGG(jt.key, jt.value) obj
FROM JSONB_ARRAY_ELEMENTS(data) je
CROSS JOIN
LATERAL JSONB_EACH(je.value) jt
) jo