Функция вставки элементов массива json в таблицу - PullRequest
0 голосов
/ 24 января 2019

Как написать функцию Postgres, которая получает значение массива JSONB и выполняет итерацию по нему для вставки элементов в реляционную таблицу?

JSON

[{"id": 1, "name": "John"},{"id": 2, "name": "Mary"}]

Таблица

CREATE TABLE Names (
  id INTEGER,
  name VARCHAR(50)
)

Функция

CREATE FUNCTION
  Insert_Names(IN data JSONB)
$$
  FOR ...
     INSERT INTO Names VALUES (...)
$$
LANGUAGE SQL;

1 Ответ

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

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