制御構文って、どんなプログラムでも基本だよね。SQLスクリプトでも、Pythonコードでも、火星のロボットが「家に信号送るか、それともクレーターの角で生命探すか」考える時でも同じ。
PL/pgSQLの制御構文は、こんな時に役立つよ:
- 条件が合ってたら、特定の処理を実行する。
- コードの実行順序をコントロールする。
- 意思決定のロジックを実装する。
イメージとしては道路標識みたいなもの:「STOP見たら止まる。青信号なら進む!」
PL/pgSQLでよく使う制御構文は:
IF– 条件をチェックして、それに応じたコマンドを実行する。CASE– 条件がたくさんある時のIFの代わり。RETURN– 関数の実行を終えて、結果を返す。
もうなんとなく知ってるかも。プログラミング言語やったことあれば、すぐ分かるはず!
条件分岐 IF
IFは、ある条件がTRUE(真)だった時だけコードを実行するために使うよ。基本の形はこんな感じ:
IF 条件 THEN
-- 条件が真の時に実行されるコード
ELSE
-- 条件が偽の時の別のコード
END IF;
数字を受け取って、それが偶数か奇数か返す関数を書いてみよう:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN '数は偶数だよ';
ELSE
RETURN '数は奇数だよ';
END IF;
END;
$$ LANGUAGE plpgsql;
じゃあ、テストしてみよう:
SELECT check_even_odd(4); -- 数は偶数だよ
SELECT check_even_odd(7); -- 数は奇数だよ
ちょっと説明:IF num % 2 = 0 THENは、2で割り切れるかどうかをチェックしてる。
ELSIF条件
1つのチェックだけじゃ足りない時、複数の条件を調べたい時はELSIFを使うよ。
例えば、温度に応じてテキストメッセージを返す関数を作ると:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN 'めっちゃ寒い!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN '涼しい';
ELSE
RETURN '暖かい!';
END IF;
END;
$$ LANGUAGE plpgsql;
テストしてみる:
SELECT temperature_comment(-5); -- めっちゃ寒い!
SELECT temperature_comment(15); -- 涼しい
SELECT temperature_comment(25); -- 暖かい!
CASEの書き方
条件が多い時は、CASEが救世主。IFに似てるけど、ちょっと「スマート」な感じ。
CASE
WHEN 条件_1 THEN 値_1
WHEN 条件_2 THEN 値_2
ELSE デフォルト値
END;
数字に応じてテキスト評価を返す関数を作ってみよう:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN '素晴らしい'
WHEN score >= 75 THEN '良い'
WHEN score >= 50 THEN 'まあまあ'
ELSE 'イマイチ'
END;
END;
$$ LANGUAGE plpgsql;
テスト:
SELECT grade_comment(95); -- 素晴らしい
SELECT grade_comment(80); -- 良い
SELECT grade_comment(45); -- イマイチ
メモ:IFと違って、CASEは値を返すから、RETURNをCASEの中でそのまま使えるよ。
RETURNの使い方
RETURNは関数の実行を終わらせて、値を返す。PL/pgSQLの関数は何か返さなきゃいけない(テキストとか数字とか)。
簡単な例でRETURNを見てみよう:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;
結果:
SELECT return_example(); -- Hello, World!
でも、もしコードの分岐がいくつかあったら?例えば、入力値のチェックとか。その場合、RETURNは関数のいろんな場所で使うことになる:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN '正の数だよ';
ELSIF num = 0 THEN
RETURN 'ゼロ';
ELSE
RETURN '負の数だよ';
END IF;
END;
$$ LANGUAGE plpgsql;
テスト:
SELECT check_positive_negative(10); -- 正の数だよ
SELECT check_positive_negative(0); -- ゼロ
SELECT check_positive_negative(-5); -- 負の数だよ
よくあるミスとハマりポイント
ENDの書き忘れ:END CASE;やEND IF;を忘れると、PostgreSQLが「ちゃんとブロック閉じて!」って怒ってくるよ。ELSIFのロジックミス:条件の順番が大事!より一般的な条件(temp > 0)を、より具体的な条件(temp > 20)より前に書いちゃダメ。RETURNの忘れ:PL/pgSQLの関数はRETURNSって書いたら、必ず何か返さなきゃダメ。
今回はここまで!PL/pgSQLの制御構文とロジックの基本を見てきたよ。この知識は、もっと複雑な関数を作る時に絶対役立つ!次回はループとその使い方をやるよ。
GO TO FULL VERSION