在 PostgreSQL 中使用循环

本文将讨论和演示如何在 PostgreSQL 中使用循环。

在 PostgreSQL 中使用 for 循环语句

for 循环有一些已定义的属性。最好分配一个在每个循环中递增或递减的变量。

然后,如果你给出一个迭代范围会有所帮助。这是 Postgres 中 FOR 语句的基本结构。

do$$beginforiin1..10loop-- some sql query
endloop;end;$$

在这里,循环将运行 10 次迭代。在 SQL 查询中,我们可以使用 i 的值。

现在,让我们演示一个示例。

postgres=#\daccounts;Table"public.accounts"Column|Type|Collation|Nullable|Default-----------+-----------------------------+-----------+----------+-------------------------------------------
user_id|integer||notnull|nextval('accounts_user_id_seq'::regclass)username|charactervarying(50)||notnull|password|charactervarying(50)||notnull|email|charactervarying(255)||notnull|contact|charactervarying(20)|||postcode|integer|||age|integer|||height|integer|||timestamp|timestampwithouttimezone|||CURRENT_TIMESTAMP

你可以在表名前使用 \d 命令查看表描述。现在,我们想知道前 10 名最年轻用户的用户名。

所以,SQL 将是,

do$$declare_recordrecord;beginfor_recordinSELECTusername,ageFROMaccountsORDERBYageascLIMIT10LOOPRAISENOTICE'Username: % (% years)',_record.username,_record.age;ENDLOOP;END;$$;

输出:

NOTICE:  Username: ChDCfhl (13 years)
NOTICE:  Username: VmgqJMB (13 years)
NOTICE:  Username: MbOTFXt (13 years)
NOTICE:  Username: WUKNQYe (13 years)
NOTICE:  Username: ldWoKpz (13 years)
NOTICE:  Username: uksgPZS (13 years)
NOTICE:  Username: YXuaLda (14 years)
NOTICE:  Username: PXrxKvO (14 years)
NOTICE:  Username: hJQXFHO (14 years)
NOTICE:  Username: XxwNIOR (14 years)

这里,_record 是一种特殊类型的 PSQL 变量,用于存储 SQL 查询的结果或返回数据。我们还可以使用 FOR 语句填充表。

在 PostgreSQL 中使用 WHILE 循环语句

FOR 循环中,你需要定义变量或迭代的范围。另一方面,WHILE 循环没有任何范围。

它会一直运行,直到满足它的条件。WHILE 语句的基本结构如下所示。

DO$$DECLARE-- declare variable if you need
BEGINWHILEconditionLOOP-- SQL QUERY / RASIE
-- Increment or decrement variable
-- Otherwise, it may fall into an infinite loop
ENDLOOP;END$$;

大多数时候,你需要变量来修改条件内的值。假设,在你的条件下,id>10;循环将一直运行到 id>10,但我们不会更改脚本中的 ID。

如果在第一次迭代中,ID 大于 10,并且我们在迭代过程中没有修改它,则 SQL 将无限运行,因为条件始终为真。

我们可以使用几个 SQL 命令。第一个命令将创建一个表;第二个 PL/SQL 将使用 WHILE 循环将数据插入表中。

成功插入数据后,我们将表格中的所有数据都显示出来。

CREATETABLErandoms(IDintprimarykey,Randomint);do$$declareidINTEGER:=1;beginWHILEid<10LOOPINSERTINTOrandoms(ID,Random)VALUES(id,random());id:=id+1;ENDLOOP;END;$$;SELECT*FROMrandoms;

输出:

postgres=# CREATE TABLE randoms(
postgres(#     ID int primary key,
postgres(#     Random int
postgres(# );
CREATE TABLE
postgres=#
postgres=# do $$
postgres$# declare
postgres$#     id INTEGER :=1;
postgres$# begin
postgres$#     WHILE id < 10 LOOP
postgres$#     INSERT INTO randoms(ID, Random) VALUES(id, random());
postgres$#     id := id+1;
postgres$#     END LOOP;
postgres$# END; $$;
DO
postgres=#
postgres=# SELECT * FROM randoms;
 id | random
----+--------
  1 |      0
  2 |      1
  3 |      1
  4 |      0
  5 |      0
  6 |      1
  7 |      0
  8 |      1
  9 |      0
(9 rows)
postgres=#

要了解有关 Postgres 循环的更多信息,你可以从此处访问官方文档。此外,如果你想了解更多关于 FORWHILE 循环的查询,你可以阅读此博客。