将json数组元素插入表中的函数

时间:2019-01-24 02:18:53

标签: postgresql jsonb

如何编写一个接收JSONB数组值并对其进行迭代以将元素插入关系表中的Postgres函数?

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 :(得分:1)

使用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)
$$;