CodeGym /コース /SQL SELF /制御構文入門:IF、CASE、RETURN

制御構文入門:IF、CASE、RETURN

SQL SELF
レベル 51 , レッスン 0
使用可能

制御構文って、どんなプログラムでも基本だよね。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は値を返すから、RETURNCASEの中でそのまま使えるよ。

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); -- 負の数だよ

よくあるミスとハマりポイント

  1. ENDの書き忘れ:END CASE;END IF;を忘れると、PostgreSQLが「ちゃんとブロック閉じて!」って怒ってくるよ。
  2. ELSIFのロジックミス:条件の順番が大事!より一般的な条件(temp > 0)を、より具体的な条件(temp > 20)より前に書いちゃダメ。
  3. RETURNの忘れ:PL/pgSQLの関数はRETURNSって書いたら、必ず何か返さなきゃダメ。

今回はここまで!PL/pgSQLの制御構文とロジックの基本を見てきたよ。この知識は、もっと複雑な関数を作る時に絶対役立つ!次回はループとその使い方をやるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION