如何在 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 函数中将数组插入表中?的主要内容,如果未能解决你的问题,请参考以下文章
将 JSON 字符串数组设置为 PostgreSQL 表中的列