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などのループ制御に対応
- 標準化されていないため、記述方法はデータベースごとにばらつきがある