Используйте jsonb_array_elements()
для распаковки таблицы и оператор ->>
для получения текстовых значений элементов.При необходимости приведите значения к соответствующим типам.
insert into names
select (elem->>'id')::int, elem->>'name'
from jsonb_array_elements('[{"id": 1, "name": "John"},{"id": 2, "name": "Mary"}]') as arr(elem)
returning *
id | name
----+------
1 | John
2 | Mary
(2 rows)
Функция может выглядеть следующим образом:
create or replace function insert_names(jsonb)
returns void language sql as $$
insert into names
select (elem->>'id')::int, elem->>'name'
from jsonb_array_elements($1) as arr(elem)
$$;
select insert_names('[{"id": 1, "name": "John"},{"id": 2, "name": "Mary"}]');
В качестве альтернативы, вы можете использовать функцию jsonb_populate_recordset()
, которая допускает еще более простой синтаксис:
create or replace function insert_names(jsonb)
returns void language sql as $$
insert into names
select *
from jsonb_populate_recordset(null::names, $1)
$$;