PgSQL條件語(yǔ)句與循環(huán)語(yǔ)句示例代碼詳解
1 條件語(yǔ)句
pgSQL中有兩種條件語(yǔ)句分別為if與case語(yǔ)句。
if if 語(yǔ)句形式包含以下幾種: IF … THEN … END IF IF … THEN … ELSE … END IF IF … THEN … ELSIF … THEN … ELSE … END IF
示例
示例函數(shù) test_if,將下方示例語(yǔ)句復(fù)制到對(duì)應(yīng)位置即可進(jìn)行測(cè)試。
create or replace function test_if(i int) returns void as $$ DECLARE BEGIN -- 替換對(duì)應(yīng)if語(yǔ)句 END; $$ LANGUAGE plpgsql; IF … THEN … END IF 該示例當(dāng)輸入值i大于10時(shí)會(huì)打印 i的值為:% if i > 10 then raise notice 'i的值為:%', i; end if; IF … THEN … ELSE … END IF
該示例當(dāng)輸入值i大于10時(shí)會(huì)打印 i的值大于10 否則會(huì)打印 i的值小于等于10
if i > 10 then raise notice 'i的值大于10'; else raise notice 'i的值小于等于10'; end if; IF … THEN … ELSIF … THEN … ELSE … END IF
該示例當(dāng)輸入值i大于10時(shí)會(huì)打印 i的值大于10 ,當(dāng)輸入值為5時(shí)會(huì)打印 ‘i的值為5’ ,否則會(huì)打印 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;
小提示
關(guān)鍵詞ELSIF也可以寫(xiě)成ELSEIF。
1.1 elsif可以寫(xiě)多個(gè)
case CASE ... WHEN ... THEN ... ELSE ... END CASE CASE WHEN ... THEN ... ELSE ... END CASE
示例
示例函數(shù) test_case,將下方示例語(yǔ)句復(fù)制到對(duì)應(yīng)位置即可進(jìn)行測(cè)試。
create or replace function test_case(i int) returns void as $$ DECLARE BEGIN -- 替換對(duì)應(yīng)case語(yǔ)句 END; $$ LANGUAGE plpgsql; CASE … WHEN … THEN … ELSE … END CASE 該示例當(dāng)輸入值i為1時(shí)會(huì)打印 i的值為1 ,當(dāng)輸入值為2時(shí)會(huì)打印 'i的值為2' ,否則會(huì)打印 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;
小提示
如果沒(méi)有找到匹配,ELSE 語(yǔ)句會(huì)被執(zhí)行
如果ELSE不存在,將會(huì)拋出一個(gè)CASE_NOT_FOUND異常CASE WHEN … THEN … ELSE … END CASE
case when是基于布爾表達(dá)式真假來(lái)執(zhí)行
該示例當(dāng)輸入值i為0-10之間時(shí)會(huì)打印 i的值在0-10之間 ,當(dāng)輸入值為11-20之間時(shí)會(huì)打印 i的值在11-20之間’ ,否則會(huì)打印 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;
小提示
如果沒(méi)有找到匹配,ELSE 語(yǔ)句會(huì)被執(zhí)行
如果ELSE不存在,將會(huì)拋出一個(gè)CASE_NOT_FOUND異常循環(huán)語(yǔ)句
1.2 LOOP 循環(huán)
[ <> ] LOOP statements END LOOP [ label ];
LOOP定義一個(gè)無(wú)條件的循環(huán),它會(huì)無(wú)限重復(fù)直到被EXIT或RETURN語(yǔ)句終止??蛇x的label可以被EXIT和CONTINUE語(yǔ)句用
在嵌套循環(huán)中指定這些語(yǔ)句引用的是哪一層循環(huán)。
示例
示例函數(shù) test_loop,將下方示例語(yǔ)句復(fù)制到對(duì)應(yīng)位置即可進(jìn)行測(cè)試。
create or replace function test_loop(i int) returns int as $$ DECLARE BEGIN -- 替換對(duì)應(yīng)loop語(yǔ)句 END; $$ LANGUAGE plpgsql; exit 退出
該示例首先對(duì)i的值加1,如果i的值大于10則退出循環(huán),執(zhí)行 return 語(yǔ)句返回結(jié)果。輸入i的值為0時(shí),返回結(jié)果11,輸入i的值為
20時(shí),返回結(jié)果21。
LOOP -- 一些計(jì)算 i = i + 1; IF i > 10 THEN EXIT; -- 退出循環(huán) END IF; END LOOP; return i; exit when 退出 該示例與上方示例效果一樣。 LOOP -- 一些計(jì)算 i = i + 1; EXIT WHEN i > 10; -- 和前一個(gè)例子相同的結(jié)果 END LOOP; return i; exit [lable]
該示例執(zhí)行 select test_loop(0) 時(shí)輸出結(jié)果為11,而不是100。當(dāng) exit 指定退出標(biāo)簽時(shí),會(huì)退出整個(gè)塊語(yǔ)句繼續(xù)執(zhí)行,以下示例退
出 twoblock ,執(zhí)行 return 語(yǔ)句,所以該值為11;
create or replace function test_loop(i int) returns int as $$ <> DECLARE BEGIN <> DECLARE BEGIN <> DECLARE begin LOOP -- 一些計(jì)算 i = i + 1; IF i > 10 THEN EXIT twoblock; -- 退出循環(huán) END IF; END LOOP; END; i = 100; END; return i; END; $$ LANGUAGE plpgsql; continue CONTINUE [ label ] [ WHEN boolean-expression ];
該示例會(huì)打印輸出i的值,其中當(dāng)i的值為5時(shí),不會(huì)打印。
LOOP i = i + 1; EXIT WHEN i > 10; CONTINUE WHEN i = 5; raise notice 'i的值為:%',i; END LOOP;
小提示
CONTINUE可以被用在所有類(lèi)型的循環(huán)中,它并不限于在LOOP中使用。
2 WHILE 循環(huán)
[ <> ] WHILE boolean-expression LOOP statements END LOOP [ label ]; 示例 示例函數(shù) test_,將下方示例語(yǔ)句復(fù)制到對(duì)應(yīng)位置即可進(jìn)行測(cè)試,下方所有循環(huán)都可以使用此函數(shù)測(cè)試。 create or replace function test_(i int) returns int as $$ DECLARE BEGIN -- 替換對(duì)應(yīng)循環(huán)語(yǔ)句 END; $$ LANGUAGE plpgsql; 該示例輸入值為0,判斷i的值是否小于10,小于10則執(zhí)行+1,否則 return 。 WHILE i < 10 LOOP i = i + 1; END LOOP; return i;
3 FOR 循環(huán)
這種形式的FOR會(huì)創(chuàng)建一個(gè)在一個(gè)整數(shù)范圍上迭代的循環(huán)。變量name會(huì)自動(dòng)定義為類(lèi)型integer并且只在循環(huán)內(nèi)存在(任何該
變量名的現(xiàn)有定義在此循環(huán)內(nèi)都將被忽略)。給出范圍上下界的兩個(gè)表達(dá)式在進(jìn)入循環(huán)的時(shí)候計(jì)算一次。如果沒(méi)有指定BY子
句,迭代步長(zhǎng)為 1,否則步長(zhǎng)是BY中指定的值,該值也只在循環(huán)進(jìn)入時(shí)計(jì)算一次。如果指定了REVERSE,那么在每次迭代后
步長(zhǎng)值會(huì)被減除而不是增加。
[ <> ] FOR name IN [ REVERSE ] expression .. expression [ BY expression ] LOOP statements END LOOP [ label ];
示例
FOR i IN 1..10 LOOP -- 我在循環(huán)中將取值 1,2,3,4,5,6,7,8,9,10 END LOOP; FOR i IN REVERSE 10..1 LOOP -- 我在循環(huán)中將取值 10,9,8,7,6,5,4,3,2,1 END LOOP; FOR i IN REVERSE 10..1 BY 2 LOOP -- 我在循環(huán)中將取值 10,8,6,4,2 END LOOP; 查詢(xún)結(jié)果循環(huán)(FOR…IN… ) FOR…IN
通過(guò)一個(gè)查詢(xún)的結(jié)果進(jìn)行迭代并且操縱相應(yīng)的數(shù)據(jù)。語(yǔ)法是:
[ <> ] FOR target IN query LOOP statements END LOOP [ label ];
target是一個(gè)記錄變量、行變量或者逗號(hào)分隔的標(biāo)量變量列表。target被連續(xù)不斷被賦予來(lái)自query的每一行,并且循環(huán)體將為
每一行執(zhí)行一次。下面是一個(gè)例子:
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 '場(chǎng)地代碼為:%,場(chǎng)地名稱(chēng)為 %', cddm.dm, quote_ident(cddm.mc); END LOOP; return 1; END; $$ LANGUAGE plpgsql;
FOR…IN…EXECUTE
FOR-IN-EXECUTE語(yǔ)句是在行上迭代的另一種方式,示例如下:
該示例將代碼作為參數(shù)傳入,使用using動(dòng)態(tài)替換。
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 '場(chǎng)地代碼為:%,場(chǎng)地名稱(chēng)為 %', cddm.dm, quote_ident(cddm.mc); END LOOP; return 1; END; $$ LANGUAGE plpgsql; 數(shù)組循環(huán)(FOREACH ) FOREACH語(yǔ)法結(jié)構(gòu)如下: [ <> ] FOREACH target [ SLICE number ] IN ARRAY expression LOOP statements END LOOP [ label ];
示例
不使用slice
該示例使用 select test_sum(array[1,2,3]) 語(yǔ)句測(cè)試會(huì)返回和為 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示例
通過(guò)一個(gè)正SLICE值,F(xiàn)OREACH通過(guò)數(shù)組的切片而不是單一元素迭代。SLICE值必須是一個(gè)不大于數(shù)組維度數(shù)的整數(shù)常
量。 target 變量必須是一個(gè)數(shù)組,并且它接收數(shù)組值的連續(xù)切片,其中每一個(gè)切片都有SLICE指定的維度數(shù)。這里是一個(gè)通過(guò)一
維切片迭代的例子:
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;
到此這篇關(guān)于PgSQL條件語(yǔ)句與循環(huán)語(yǔ)句的文章就介紹到這了,更多相關(guān)PgSQL條件語(yǔ)句與循環(huán)語(yǔ)句內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。