網站首頁 編程語言 正文
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;
原文鏈接:https://blog.csdn.net/ZGL_cyy/article/details/125683887
相關推薦
- 2022-07-21 CUICatalog: Invalid asset name supplied: ‘‘
- 2022-09-13 Go中的關鍵字any?interface是否會成為歷史_Golang
- 2022-01-09 uview 使用scroll-view以及swiper 做tabs
- 2022-07-18 SpringBoot之定時任務三種實現方法
- 2022-04-25 mongodb?linux下集群搭建過程_MongoDB
- 2022-11-30 Git基礎學習之分支基本操作詳解_相關技巧
- 2022-07-11 Python內建屬性getattribute攔截器使用詳解_python
- 2023-04-11 Go使用協程批量獲取數據加快接口返回速度_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支