将 json 数组元素插入 table 的函数
Function inserting json array elements into a table
如何编写接收 JSONB 数组值并迭代它以将元素插入关系 table 的 Postgres 函数?
JSON
[{"id": 1, "name": "John"},{"id": 2, "name": "Mary"}]
Table
CREATE TABLE Names (
id INTEGER,
name VARCHAR(50)
)
函数
CREATE FUNCTION
Insert_Names(IN data JSONB)
$$
FOR ...
INSERT INTO Names VALUES (...)
$$
LANGUAGE SQL;
使用jsonb_array_elements()
解包table,使用运算符->>
获取元素的文本值。如有必要,将值转换为适当的类型。
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() 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, )
$$;
如何编写接收 JSONB 数组值并迭代它以将元素插入关系 table 的 Postgres 函数?
JSON
[{"id": 1, "name": "John"},{"id": 2, "name": "Mary"}]
Table
CREATE TABLE Names (
id INTEGER,
name VARCHAR(50)
)
函数
CREATE FUNCTION
Insert_Names(IN data JSONB)
$$
FOR ...
INSERT INTO Names VALUES (...)
$$
LANGUAGE SQL;
使用jsonb_array_elements()
解包table,使用运算符->>
获取元素的文本值。如有必要,将值转换为适当的类型。
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() 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, )
$$;