在 PostgreSQL 中使用迴圈
Shihab Sikder
2023年12月11日
本文將討論和演示如何在 PostgreSQL 中使用迴圈。
在 PostgreSQL 中使用 for
迴圈語句
for
迴圈有一些已定義的屬性。最好分配一個在每個迴圈中遞增或遞減的變數。
然後,如果你給出一個迭代範圍會有所幫助。這是 Postgres 中 FOR
語句的基本結構。
do $$
begin
for i in 1..10 loop
-- some sql query
end loop;
end; $$
在這裡,迴圈將執行 10 次迭代。在 SQL 查詢中,我們可以使用 i
的值。
現在,讓我們演示一個示例。
postgres=# \d accounts;
Table "public.accounts"
Column | Type | Collation | Nullable | Default
-----------+-----------------------------+-----------+----------+-------------------------------------------
user_id | integer | | not null | nextval('accounts_user_id_seq'::regclass)
username | character varying(50) | | not null |
password | character varying(50) | | not null |
email | character varying(255) | | not null |
contact | character varying(20) | | |
postcode | integer | | |
age | integer | | |
height | integer | | |
timestamp | timestamp without time zone | | | CURRENT_TIMESTAMP
你可以在表名前使用 \d
命令檢視錶描述。現在,我們想知道前 10 名最年輕使用者的使用者名稱。
所以,SQL 將是,
do $$
declare
_record record;
begin
for _record in SELECT username, age
FROM accounts
ORDER BY age asc
LIMIT 10
LOOP
RAISE NOTICE 'Username: % (% years)', _record.username, _record.age;
END LOOP;
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
BEGIN
WHILE condition LOOP
-- SQL QUERY / RASIE
-- Increment or decrement variable
-- Otherwise, it may fall into an infinite loop
END LOOP;
END$$;
大多數時候,你需要變數來修改條件內的值。假設,在你的條件下,id>10
;迴圈將一直執行到 id>10
,但我們不會更改指令碼中的 ID。
如果在第一次迭代中,ID 大於 10,並且我們在迭代過程中沒有修改它,則 SQL 將無限執行,因為條件始終為真。
我們可以使用幾個 SQL 命令。第一個命令將建立一個表;第二個 PL/SQL 將使用 WHILE
迴圈將資料插入表中。
成功插入資料後,我們將表格中的所有資料都顯示出來。
CREATE TABLE randoms(
ID int primary key,
Random int
);
do $$
declare
id INTEGER :=1;
begin
WHILE id < 10 LOOP
INSERT INTO randoms(ID, Random) VALUES(id, random());
id := id+1;
END LOOP;
END; $$;
SELECT * FROM randoms;
輸出:
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 迴圈的更多資訊,你可以從此處訪問官方文件。此外,如果你想了解更多關於 FOR
和 WHILE
迴圈的查詢,你可以閱讀此部落格。
作者: Shihab Sikder