如何在 postgresql 函数中将数组插入表中?

Posted

技术标签:

【中文标题】如何在 postgresql 函数中将数组插入表中?【英文标题】:How insert a array into a table in postgresql function? 【发布时间】: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 类型

【问题讨论】:

【参考方案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 很好用。如果它回答了您的问题,请考虑接受并支持答案,以便其他用户也可以从中获利。欢呼

以上是关于如何在 postgresql 函数中将数组插入表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中将数组值作为键值对插入到数据库表中

如何将数组项插入 PostgreSQL 表

将 JSON 字符串数组设置为 PostgreSQL 表中的列

复合数组类型作为 PostgreSQL 中的 OUTPUT 参数

PostgreSQL 外键数组

在Javascript / React中将对象转换为数组