Вставить массив объектов JSONB из одной таблицы в виде нескольких строк во второй таблице - PullRequest
0 голосов
/ 18 января 2019

Мы пытаемся перенести данные из столбца массива, содержащего 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 в виде правильной таблицы, чтобы мы могли выполнить запрос внутри хранимой процедуры, запущенной при вставке ?

1 Ответ

0 голосов
/ 18 января 2019

Используйте 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.

...