【问题标题】:Function inserting json array elements into a table将json数组元素插入表的函数
【发布时间】:2019-01-24 02:18:53
【问题描述】:

如何编写一个接收 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;

【问题讨论】:

    标签: postgresql jsonb


    【解决方案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)
    $$;
    

    【讨论】:

    • 完美。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2018-02-25
    • 2011-12-24
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多