SQLでループ処理を使ったサンプルについてまとめています。
SQLループ処理のサンプル
SQLのループ制御は、SQL標準になっていません。しかし、主要データベースではLOOP、WHILE、FORを使ったループ制御に対応しています。
【関連記事】
▶SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?
SQLでLOOP文を使ったサンプル
MySQLでは、ストアドプロシジャ内でLOOPを使った制御が使用可能です。
LOOPは、単純な繰り返しをおこなう制御で、IF文の条件分岐でループを抜ける処理を行います。MySQLの場合はLEAVE文で指定したラベル名のループを抜け出します。
DELIMITER // CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DECLARE b, c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur1; OPEN cur2; read_loop: LOOP FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF done THEN LEAVE read_loop; END IF; IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END LOOP; CLOSE cur1; CLOSE cur2; END; // DELIMITER ;
【関連記事】
▶SQLのfetchは、select結果を1件づつ取り出す NOT FOUND判定はDB差あり
postgreSQLでも同様に、LOOPによる繰り返しを、以下のようにIFの条件分岐で抜けます。EXITはLOOPを抜け出すほか、BEGIN ENDブロックを抜けるときにも使われます。
LOOP -- 何らかの演算 IF count > 0 THEN EXIT; -- ループを抜け出す END IF; END LOOP;
SQLでFORを使ったサンプル
FORは、指定した回数を繰り返しおこなうための制御文です。
以下は、OracleのPL/SQL内でFORを使ったサンプルです。よくあるスクリプト言語のように、繰り返し回数を指定でき、現在の繰り返し回数を変数として扱うことが可能です。
BEGIN DBMS_OUTPUT.PUT_LINE ('lower_bound < upper_bound'); FOR i IN 1..3 LOOP DBMS_OUTPUT.PUT_LINE (i); END LOOP; DBMS_OUTPUT.PUT_LINE ('lower_bound = upper_bound'); FOR i IN 2..2 LOOP DBMS_OUTPUT.PUT_LINE (i); END LOOP; DBMS_OUTPUT.PUT_LINE ('lower_bound > upper_bound'); FOR i IN 3..1 LOOP DBMS_OUTPUT.PUT_LINE (i); END LOOP; END; / 結果: lower_bound < upper_bound 1 2 3 lower_bound = upper_bound 2 lower_bound > upper_bound
SQLでWHILEを使ったサンプル
WHILEは指定した変数(以下のサンプルではdone)が真(TRUE)の間だけループ内の処理を実行します。
以下は、OracleのPL/SQLでWHILEを使ったサンプルです。
最初のWHILE done LOOPは、変数doneがFALSEのため実行されません。
DECLARE done BOOLEAN := FALSE; BEGIN WHILE done LOOP DBMS_OUTPUT.PUT_LINE ('This line does not print.'); done := TRUE; -- This assignment is not made. END LOOP; WHILE NOT done LOOP DBMS_OUTPUT.PUT_LINE ('Hello, world!'); done := TRUE; END LOOP; END; / 結果: Hello, world!
以下は、SQL ServerでWHILEを使うサンプルです。WHILE条件が真の間ループするのは変わらないのですが、条件部分にselectを記述することができます。
USE AdventureWorks2012; GO WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300 BEGIN UPDATE Production.Product SET ListPrice = ListPrice * 2 SELECT MAX(ListPrice) FROM Production.Product IF (SELECT MAX(ListPrice) FROM Production.Product) > $500 BREAK ELSE CONTINUE END PRINT 'Too much for the market to bear';
関連)WHILE (Transact-SQL) – SQL Server | Microsoft Docs
postgreSQLもWHILEに対応しています。WHILEの条件文が真の場合はLOOPを行います。条件文はANDやORで接続して複数の条件を記述することが可能です。
WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP -- ここで演算をいくつか行います。 END LOOP; WHILE NOT boolean_expression LOOP -- ここで演算をいくつか行います。 END LOOP;
まとめ
- SQLのループ制御はSQL標準ではないが、主要データベースでは対応している
- LOOP、WHILE、FORなどのループ制御に対応
- 標準化されていないため、記述方法はデータベースごとにばらつきがある