Postgres 9.6 如何遍历数组并将每个数组值插入表中?

Posted

技术标签:

【中文标题】Postgres 9.6 如何遍历数组并将每个数组值插入表中?【英文标题】:Postgres 9.6 How to loop over array and insert each array value into tables? 【发布时间】:2020-09-17 19:11:07 【问题描述】:

我似乎无法弄清楚这一点,以下是尝试使用 pgadmin 查询工具在 postgres 中作为 foreach 循环运行的项目数组,对于数组中的每个项目 x,执行 2 个插入语句其中x 是每个数组值:

我根据https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-FOREACH-ARRAY 第 42.6.7 节进行了尝试。遍历数组,这里有一些伪代码:

DO
$do$
BEGIN
   FOREACH x IN ['Apple','Banana','Cantaloupe']
   LOOP

    INSERT INTO foods.fruits(id, comment, fruit_name)
    VALUES ((SELECT MAX(id) + 1 FROM foods.fruits), 'a comment', x);

    INSERT INTO foods.fruits_ordered(id, price, fruit_id)
    VALUES ((SELECT MAX(id) + 1 FROM foods.fruits_ordered), '5.00', (SELECT id FROM foods.fruits WHERE fruit_name = x));

   END LOOP;
END
$do$;

这应该运行循环 3 次,总共进行 6 次插入。 知道如何让它工作吗?

【问题讨论】:

select max() + 1 是一种生成唯一 ID 的糟糕方法。您应该使用serial 列(基于序列)。但是您不需要 PL/pgSQL 或循环开头:dbfiddle.uk/… 你得到什么错误? 抱歉错过了第一个插入中的评论字段,第二个插入中的价格字段刚刚更新了它们,我得到的错误是 ERROR: syntax error at or near "[" btw 【参考方案1】:

这个['Apple','Banana','Cantaloupe'] 可能不是一个正确的数组定义,这应该更像array['Apple','Banana','Cantaloupe']::varchar[]

固定的loop 可能类似于以下内容

...
FOREACH x IN array(select array['Apple','Banana','Cantaloupe']::varchar[])
...

接下来,x 应该在块开始之前声明(begin),如下

DO
$do$
/*
type could be text
Better be based on target field should be inserted as
foods.fruits.fruit_name%type
*/
declare x varchar(31); 
declare res text;
BEGIN
...

最终脚本可能类似于

DO
$do$
declare x _names.n%type;
BEGIN
   FOREACH x IN array(select array['Apple','Banana','Cantaloupe']::varchar[])
   LOOP
   /*inserts here...*/    
   END LOOP;
END
$do$;

另一种选择是使用unnest 函数,它将数组转换为行。

例如

select array[9,1,1,9,9,2]::int[]
/*
9,1,1,9,9,2
*/
select unnest("array") from (select array[9,1,1,9,9,2]::int[] as "array") as "req"
/*
9
1
1
9
9
2
*/

使用for x in select ...循环选择

【讨论】:

array(select array['Apple','Banana','Cantaloupe']::varchar[])可以简化为array['Apple','Banana','Cantaloupe'] 我使用了最终的脚本,它运行得非常完美,而不是unnest,非常感谢!

以上是关于Postgres 9.6 如何遍历数组并将每个数组值插入表中?的主要内容,如果未能解决你的问题,请参考以下文章

遍历一个数组,将每个项目添加到一个对象并将其推送到 Javascript 中的数组

如何遍历 .dat 文件并将每组行的特定列附加到数组

在 Postgres 9.6 中创建数据透视表

Postgresql 遍历一个数组字段并将记录用于另一个查询

如何在单击多个项目时使用 jQuery 循环遍历数组?

如何遍历对象数组并将值放入过滤器?