【问题标题】:SQL procedure loop on a key from JSON object来自 JSON 对象的键的 SQL 过程循环
【发布时间】:2021-07-25 14:33:42
【问题描述】:

我正在尝试将 JSON 对象插入到多个表中

CREATE TABLE images
(
    id serial primary key ,
    image_url varchar(255),
    filename varchar(255)
);

程序:

CREATE OR REPLACE procedure example1(
    images_json json
)
AS
    $$
    DECLARE i json;
BEGIN
        RAISE NOTICE 'ITEM ID is %',images_json->>'item_id'; --will be used later on
    FOR i IN SELECT * FROM json_array_elements(images_json->>'images')
    LOOP
        INSERT INTO images (image_url, filename) VALUES (i->>'url', i->>'filename');
    end loop;
end;
    $$
    language plpgsql;

当我测试它时

call example1('{"item_id": 123,"images":[{ "url": "https://google.com","filename": "google.png"},
{ "url": "https://yahoo.com","filename":"yahoo.png"},
{"url": "https://www.bing.com","filename":"bing.png"}]}')

我收到以下错误

错误:函数 json_array_elements(text) 不存在

没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
其中:PL/pgSQL function example1(json) line 5 at FOR over SELECT rows

我想将每个图像数组插入到images 表中。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您的直接错误是,->> 返回 text 值,但 json_array_elements() 期望 json 值。您需要在这里使用-> 运算符:

    FOR i IN SELECT * FROM json_array_elements(images_json -> 'images')
                                                            ^ here
    

    但您不需要为此使用 LOOP(或以 PL/pgSQL 开头):

    CREATE OR REPLACE procedure example1(images_json json)
    AS
    $$
    BEGIN
      RAISE NOTICE 'ITEM ID is %',images_json->>'item_id'; --will be used later on
      INSERT INTO images (image_url, filename) 
      SELECT i->>'url', i->>'filename'
      FROM json_array_elements(images_json -> 'images') as i;
    end;
    $$
    language plpgsql;
    

    【讨论】:

    • 这行得通,如果由于某种原因我必须使用 for 循环选项,请您添加到答案中
    • @porgrammer3124:查看我的第一个代码示例:它向您展示了如何使用(慢)循环来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2021-12-20
    • 2016-10-11
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多