如何使用 Postgres 在 SQL 中执行 for 循环?

Posted

技术标签:

【中文标题】如何使用 Postgres 在 SQL 中执行 for 循环?【英文标题】:How do I do a for loop in SQL using Postgres? 【发布时间】:2018-04-23 09:25:26 【问题描述】:

我有 Python 的基本背景,并且我对 SQL 的了解也在不断增长,但我从未对 SQL 中的循环做过任何事情。 我想使用列表在 SQL 中执行 for 循环,并在 pgAdmin 4 中执行此操作。

所以从 Python 的角度来看,我想翻译 "for l in list" 语句写入 SQL。

我已经在网上进行了很多研究,但我找不到一个教程或手册来逐步解释它的工作原理以及声明中每个单词或部分的作用。

是否有适合 SQL 循环初学者的网站、手册、教程甚至书籍可以推荐?或者有人可以在这里的答案评论中解释它,如果它不是太复杂和太长的话?

根据我目前对 SQL 中的循环的研究,下面是我尝试做的一个示例:

CREATE TABLE draft AS
FOR x IN list [green1, blue2, red4]
LOOP
-- do this and that --
END LOOP;

【问题讨论】:

这里可能不需要循环;也许一个查询就足够了。你能告诉我们为什么你需要一个循环吗? 嗨,我需要一个循环,以便将相同的语句/查询集应用于列表中的每个项目,我的列表中有 50 多个项目。 究竟什么是“这个和那个”? SQL 是一种集合处理语言,在“循环”中思考是非常不寻常的。请edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted text 请no screen shots。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息) SQL 是声明性语言,而不是算法 【参考方案1】:

您可以使用 PL/SQL 执行类似的操作来循环数组。

declare
   type draft_arr_type is table of  draft%rowtype index by pls_integer;
   v_draft_arr draft_arr_type;
begin
   SELECT *
      bulk collect into v_draft_arr
      FROM draft
      ORDER BY <what you want here>;

   for i in v_draft_arr.first..v_draft_arr.last loop
      --code
   end loop;
end;

【讨论】:

【参考方案2】:

SQL 没有循环,你必须使用 PL/pgSQL,才能编写循环。

查看https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS

【讨论】:

以上是关于如何使用 Postgres 在 SQL 中执行 for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在heroku上执行.sql脚本?

如何使用 postgres 从 geom 列添加质心列?

postgres 在查询面板直接执行查询语句while

如何使用App Engine上的Python标准环境连接到Cloud SQL上的Postgres

使用 python 对 postgres 执行 upsert 操作,如 pandas to_sql 函数

如何在 Postgres 查询窗口中使用参数测试我的 ad-hoc SQL