在 PostgreSQL 中使用迴圈

Shihab Sikder 2023年12月11日
  1. 在 PostgreSQL 中使用 for 迴圈語句
  2. 在 PostgreSQL 中使用 WHILE 迴圈語句
在 PostgreSQL 中使用迴圈

本文將討論和演示如何在 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 迴圈的更多資訊,你可以從此處訪問官方文件。此外,如果你想了解更多關於 FORWHILE 迴圈的查詢,你可以閱讀此部落格

作者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website