【问题标题】:How insert a array into a table in postgresql function?如何在 postgresql 函数中将数组插入表中?
【发布时间】:2022-01-01 05:49:51
【问题描述】:

我在函数中收到了一个 jsonb,我需要在不同的行中插入

{
"client":"12345678",
"documents": ["0ca15b8f-c7b3-4a36-931b-e3faf6eaa571",
            "597c18e5-10d4-4656-a256-108e9674c3aa",
            "68056dfc-9799-4baf-b26b-4336586a5a2e"]
}

目前我正在测试:

CREATE OR REPLACE FUNCTION tribal.fn_add_documents(spec jsonb)
 RETURNS json
 LANGUAGE plpgsql
AS $function$
    begin
        INSERT INTO documents (id_document) 
            SELECT * FROM json_array_elements(spec->'documents'::json);
        return ('{"code" : "200"}'::jsonb);
    END;
$function$;

我希望有这样的结果

client id_document
12345678 0ca15b8f-c7b3-4a36-931b-e3faf6eaa571
12345678 597c18e5-10d4-4656-a256-108e9674c3aa
12345678 68056dfc-9799-4baf-b26b-4336586a5a2e

id_document 是一个 UUID 类型

【问题讨论】:

    标签: sql postgresql function plpgsql


    【解决方案1】:

    欢迎来到 SO。

    我不确定你的问题是否正确,但如果你只是想取消嵌套 jsonb 数组并重复客户端 ID,只需执行以下操作

    SELECT 
      spec->>'client' AS client,
      (jsonb_array_elements(spec->'documents')->>0)::uuid AS id_document
    

    演示:db<>fiddle

    WITH j (spec) AS ( VALUES
      ('{"client":"12345678",
      "documents": ["0ca15b8f-c7b3-4a36-931b-e3faf6eaa571",
                "597c18e5-10d4-4656-a256-108e9674c3aa",
                "68056dfc-9799-4baf-b26b-4336586a5a2e"]
      }'::jsonb)
    )
    SELECT 
      spec->>'client' AS client,
      (jsonb_array_elements(spec->'documents')->>0)::uuid AS id_document
    FROM j;
    
      client  |             id_document              
    ----------+--------------------------------------
     12345678 | 0ca15b8f-c7b3-4a36-931b-e3faf6eaa571
     12345678 | 597c18e5-10d4-4656-a256-108e9674c3aa
     12345678 | 68056dfc-9799-4baf-b26b-4336586a5a2e
    

    如您所见,没有必要为此编写 PL/pgSQL 函数,但如果必须,它的外观如下:

    CREATE OR REPLACE FUNCTION tribal.fn_add_documents(spec jsonb)
     RETURNS json
     LANGUAGE plpgsql
    AS $$
    BEGIN
      INSERT INTO documents (client,id_document) 
      SELECT spec->>'client',
      (jsonb_array_elements(spec->'documents')->>0)::uuid;
    RETURN('{"code" : "200"}'::jsonb);
    END; $$;
    

    【讨论】:

    • 我尝试了您的代码,但没有收到任何错误,但没有保存数据。需要“确认”吗?例如:在 Python 中,在设置“插入”之后需要一个“conn.commit”。谢谢!
    • @HendrisVs 你是怎么调用函数的?
    • 抱歉之前的问题。代码可以正常工作,谢谢 JIm!!
    • @HendrisVs 很好用。如果它回答了您的问题,请考虑接受并支持答案,以便其他用户也可以从中获利。欢呼
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2012-02-27
    • 2019-08-29
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多