【実務・中級編】 PL/pgSQLの制御構造 – PostgreSQL

やあ、今日もデータベースと格闘してる?
PostgreSQLを使っていると、クエリだけではどうにもならない複雑なロジックを扱いたくなる瞬間があるよね。「ストアドプロシージャや関数で、もう少し柔軟な処理が書けたらいいのに……」と思ったことがあるなら、今日解説するPL/pgSQLがその救世主になるよ。

今回は、PL/pgSQLの「制御構造」にフォーカスして、実務でよく使う書き方を現場の視点で整理してみた。教科書を丸写しするような退屈な話は抜きにして、実際にどう使うとスマートか、という点に絞って話していくね。

—

条件分岐の基本:IFとCASE

まずは避けて通れない条件分岐。ここは直感的だけど、使い分けが大事だ。

IF文:迷ったらまずはこれ

基本はシンプル。`ELSIF`の綴りには注意してね(`ELSEIF`ではないから!)。

IF condition THEN
— 処理
ELSIF condition THEN
— 別の処理
ELSE
— それ以外
END IF;

実務でのコツとしては、「条件が複雑になりそうなら早めにCASEへ移行する」こと。IF文が何重にもネストされると、後で修正するときに地獄を見るからね。

CASE文:可読性の要

複数の条件をパッと見やすくするなら、圧倒的にCASE文がおすすめ。

CASE
WHEN score >= 90 THEN grade := ‘S’;
WHEN score >= 80 THEN grade := ‘A’;
ELSE grade := ‘B’;
END CASE;

これ、スッキリしてていいよね。ビジネスロジックを書くなら、迷わずCASEを使おう。

—

ループ処理:闇雲に回さないのがプロの流儀

PL/pgSQLでループを書くとき、一番気をつけたいのは「本当にループが必要か?」を自問することだ。SQLは集合演算が得意だから、ループを回さずに`INSERT INTO … SELECT`で一括処理できないか、まずは一度立ち止まって考えてみて。

どうしてもループが必要なときは、以下の3つを使い分ける。

1. 基本のLOOP

`EXIT WHEN`を組み合わせるのが基本形だね。

LOOP
— 処理
EXIT WHEN condition; — 条件を満たしたら抜ける
END LOOP;

2. WHILEループ

「条件を満たしている間だけ繰り返す」という、おなじみの構造。

WHILE count < 10 LOOP -- 処理 count := count + 1; END LOOP;

3. FORループ(実務の主役)

個人的に一番よく使うのがこれ。特に「クエリの結果を1行ずつ舐める」ときには最強だよ。

FOR record_var IN SELECT id, name FROM users WHERE active = true LOOP
RAISE NOTICE ‘Processing user: %’, record_var.name;
— ここで複雑な個別処理を行う
END LOOP;

わざわざカーソルを宣言して開いて閉じて……なんて面倒なことをしなくても、FORループなら自動的にやってくれる。これがPL/pgSQLのいいところだよね。

—

ループ制御:EXITとCONTINUEを使いこなす

ループの中で「このケースはスキップしたい」「ここで中断したい」という場面はあるはず。

  • EXIT: ループを完全に打ち切る。
  • CONTINUE: 次のイテレーション(ループの先頭)にジャンプする。

FOR i IN 1..10 LOOP
IF i % 2 = 0 THEN
CONTINUE; — 偶数はスキップして次へ
END IF;

IF i = 9 THEN
EXIT; — 9になったらループ自体を終了
END IF;

RAISE NOTICE ‘Number: %’, i;
END LOOP;

これを使うだけで、if文の深いネストを回避できて、コードがぐっと読みやすくなるよ。

—

最後に:先輩からのアドバイス

PL/pgSQLは強力だけど、「DB側でやりすぎない」という視点も忘れないでほしい。DBはデータの整合性を保つのが本分。ビジネスロジックの核心までDBに詰め込みすぎると、テストやデバッグが困難になるし、スケールアウトもしにくくなる。

「計算処理はアプリケーション側で、整合性が重要な分岐処理はDB側で」というバランス感覚を持つことが、中級者から一歩先へ進むコツだよ。

もし「こんな複雑な処理はどう書けばいいの?」という疑問があったら、いつでもまた聞いてくれ。コードは書けば書くほど自分の血肉になる。今日学んだことを、ぜひ次の開発で試してみて!

それじゃ、また現場で会おう。ハッピー・コーディング!

コメント

タイトルとURLをコピーしました