首頁 > 軟體

PgSQL條件語句與迴圈語句範例程式碼詳解

2022-07-09 22:01:56

1 條件語句

pgSQL中有兩種條件語句分別為if與case語句。

if
if 語句形式包含以下幾種:
IF … THEN … END IF
IF … THEN … ELSE … END IF
IF … THEN … ELSIF … THEN … ELSE … END IF

範例
範例函數 test_if,將下方範例語句複製到對應位置即可進行測試。

create or replace function test_if(i int) returns void as $$
DECLARE
BEGIN
-- 替換對應if語句
END;
$$ LANGUAGE plpgsql;
IF … THEN … END IF
該範例當輸入值i大於10時會列印 i的值為:%
if i > 10 then
raise notice 'i的值為:%', i;
end if;
IF … THEN … ELSE … END IF

該範例當輸入值i大於10時會列印 i的值大於10 否則會列印 i的值小於等於10

if i > 10 then
raise notice 'i的值大於10';
else
raise notice 'i的值小於等於10';
end if;
IF … THEN … ELSIF … THEN … ELSE … END IF

該範例當輸入值i大於10時會列印 i的值大於10 ,當輸入值為5時會列印 ‘i的值為5’ ,否則會列印 i的值小於等於10

if i > 10 then
raise notice 'i的值大於10';
elsif i = 5 then
raise notice 'i的值為5';
else
raise notice 'i的值小於等於10';
end if;

小提示
關鍵詞ELSIF也可以寫成ELSEIF。

1.1 elsif可以寫多個

case
CASE ... WHEN ... THEN ... ELSE ... END CASE
CASE WHEN ... THEN ... ELSE ... END CASE

範例
範例函數 test_case,將下方範例語句複製到對應位置即可進行測試。

create or replace function test_case(i int) returns void as $$
DECLARE
BEGIN
-- 替換對應case語句
END;
$$ LANGUAGE plpgsql;
CASE … WHEN … THEN … ELSE … END CASE
該範例當輸入值i為1時會列印 i的值為1 ,當輸入值為2時會列印 'i的值為2' ,否則會列印 i的值既不為1也不為2
case i
when 1,3 then
raise notice 'i的值為1';
when 2 then
raise notice 'i的值為2';
else
raise notice 'i的值既不為1也不為2';
end case;

小提示
如果沒有找到匹配,ELSE 語句會被執行
如果ELSE不存在,將會丟擲一個CASE_NOT_FOUND異常
CASE WHEN … THEN … ELSE … END CASE
case when是基於布林表示式真假來執行
該範例當輸入值i為0-10之間時會列印 i的值在0-10之間 ,當輸入值為11-20之間時會列印 i的值在11-20之間’ ,否則會列印 i的值不在0-20之間

CASE
WHEN i BETWEEN 0 AND 10 THEN
raise notice 'i的值在0-10之間';
WHEN i BETWEEN 11 AND 20 THEN
raise notice 'i的值在11-20之間';
else
raise notice 'i的值不在0-20之間';
END CASE;

小提示
如果沒有找到匹配,ELSE 語句會被執行
如果ELSE不存在,將會丟擲一個CASE_NOT_FOUND異常回圈語句

1.2 LOOP 迴圈

[ <> ] LOOP
statements
END LOOP [ label ];

LOOP定義一個無條件的迴圈,它會無限重複直到被EXIT或RETURN語句終止。可選的label可以被EXIT和CONTINUE語句用
在巢狀迴圈中指定這些語句參照的是哪一層迴圈。
範例
範例函數 test_loop,將下方範例語句複製到對應位置即可進行測試。

create or replace function test_loop(i int) returns int as $$
DECLARE
BEGIN
-- 替換對應loop語句
END;
$$ LANGUAGE plpgsql;
exit 退出

該範例首先對i的值加1,如果i的值大於10則退出迴圈,執行 return 語句返回結果。輸入i的值為0時,返回結果11,輸入i的值為
20時,返回結果21。

LOOP
-- 一些計算
i = i + 1;
IF i > 10 THEN
EXIT; -- 退出迴圈
END IF;
END LOOP;
return i;
exit when 退出
該範例與上方範例效果一樣。
LOOP
-- 一些計算
i = i + 1;
EXIT WHEN i > 10; -- 和前一個例子相同的結果
END LOOP;
return i;
exit [lable]

該範例執行 select test_loop(0) 時輸出結果為11,而不是100。當 exit 指定退出標籤時,會退出整個塊語句繼續執行,以下範例退
出 twoblock ,執行 return 語句,所以該值為11;

create or replace function test_loop(i int) returns int as $$
<>
DECLARE
BEGIN
<>
DECLARE
BEGIN
<>
DECLARE
begin
LOOP
-- 一些計算
i = i + 1;
IF i > 10 THEN
EXIT twoblock; -- 退出迴圈
END IF;
END LOOP;
END;
i = 100;
END;
return i;
END;
$$ LANGUAGE plpgsql;
continue
CONTINUE [ label ] [ WHEN boolean-expression ];

該範例會列印輸出i的值,其中當i的值為5時,不會列印。

LOOP
i = i + 1;
EXIT WHEN i > 10;
CONTINUE WHEN i = 5;
raise notice 'i的值為:%',i;
END LOOP;

小提示
CONTINUE可以被用在所有型別的迴圈中,它並不限於在LOOP中使用。

2 WHILE 迴圈

[ <> ] WHILE boolean-expression LOOP
statements
END LOOP [ label ];
範例
範例函數 test_,將下方範例語句複製到對應位置即可進行測試,下方所有迴圈都可以使用此函數測試。
create or replace function test_(i int) returns int as $$
DECLARE
BEGIN
-- 替換對應迴圈語句
END;
$$ LANGUAGE plpgsql;
該範例輸入值為0,判斷i的值是否小於10,小於10則執行+1,否則 return 。
WHILE i < 10 LOOP
i = i + 1;
END LOOP;
return i;

3 FOR 迴圈

這種形式的FOR會建立一個在一個整數範圍上迭代的迴圈。變數name會自動定義為型別integer並且只在迴圈記憶體在(任何該
變數名的現有定義在此迴圈內都將被忽略)。給出範圍上下界的兩個表示式在進入迴圈的時候計算一次。如果沒有指定BY子
句,迭代步長為 1,否則步長是BY中指定的值,該值也只在迴圈進入時計算一次。如果指定了REVERSE,那麼在每次迭代後
步長值會被減除而不是增加。

[ <> ] FOR name IN [ REVERSE ] expression .. expression [ BY expression ] LOOP
statements
END LOOP [ label ];

範例

FOR i IN 1..10 LOOP
-- 我在迴圈中將取值 1,2,3,4,5,6,7,8,9,10
END LOOP;
FOR i IN REVERSE 10..1 LOOP
-- 我在迴圈中將取值 10,9,8,7,6,5,4,3,2,1
END LOOP;
FOR i IN REVERSE 10..1 BY 2 LOOP
-- 我在迴圈中將取值 10,8,6,4,2
END LOOP;
查詢結果迴圈(FOR…IN… )
FOR…IN

通過一個查詢的結果進行迭代並且操縱相應的資料。語法是:

[ <> ] FOR target IN query LOOP
statements
END LOOP [ label ];

target是一個記錄變數、行變數或者逗號分隔的標量變數列表。target被連續不斷被賦予來自query的每一行,並且迴圈體將為
每一行執行一次。下面是一個例子:

create or replace function test_for_in() returns int as $$
DECLARE
cddm record;
BEGIN
RAISE NOTICE 'reading jcb_cddm...';
FOR cddm IN SELECT * FROM jcb_cddm limit 5 LOOP
RAISE NOTICE '場地程式碼為:%,場地名稱為 %', cddm.dm, quote_ident(cddm.mc);
END LOOP;
return 1;
END;
$$ LANGUAGE plpgsql;

FOR…IN…EXECUTE
FOR-IN-EXECUTE語句是在行上迭代的另一種方式,範例如下:
該範例將程式碼作為引數傳入,使用using動態替換。

create or replace function test_for_in(dm varchar) returns int as $$
DECLARE
cddm record;
BEGIN
RAISE NOTICE 'reading jcb_cddm...';
FOR cddm IN execute 'SELECT * FROM jcb_cddm where dm = $1 limit 5' using dm LOOP
RAISE NOTICE '場地程式碼為:%,場地名稱為 %', cddm.dm, quote_ident(cddm.mc);
END LOOP;
return 1;
END;
$$ LANGUAGE plpgsql;
陣列迴圈(FOREACH )
FOREACH語法結構如下:
[ <> ] FOREACH target [ SLICE number ] IN ARRAY expression LOOP
statements
END LOOP [ label ];

範例
不使用slice
該範例使用 select test_sum(array[1,2,3]) 語句測試會返回和為 6

CREATE FUNCTION test_sum(int[]) RETURNS int8 AS $$
DECLARE
s int8 := 0;
x int;
BEGIN
FOREACH x IN ARRAY $1
LOOP
s := s + x;
END LOOP;
RETURN s;
END;
$$ LANGUAGE plpgsql;

slice範例
通過一個正SLICE值,FOREACH通過陣列的切片而不是單一元素迭代。SLICE值必須是一個不大於陣列維度數的整數常
量。 target 變數必須是一個陣列,並且它接收陣列值的連續切片,其中每一個切片都有SLICE指定的維度數。這裡是一個通過一
維切片迭代的例子:

CREATE FUNCTION scan_rows(int[]) RETURNS void AS $$
DECLARE
x int[];
BEGIN
FOREACH x SLICE 1 IN ARRAY $1
LOOP
RAISE NOTICE 'row = %', x;
END LOOP;
END;
$$ LANGUAGE plpgsql;

到此這篇關於PgSQL條件語句與迴圈語句的文章就介紹到這了,更多相關PgSQL條件語句與迴圈語句內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com