Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのifの構文、DBMSごとの違いや注意点についてまとめています。

SQLのifの構文

if文は、標準SQLではストアドプロシジャやストアドファンクションでのみ使用できます。

IF 条件A THEN SQL文A
    [ELSEIF 条件B THEN SQL文B] ...
    [ELSE SQL文C]
END IF

条件Aが真ならSQL文Aを、条件Bが真ならSQL文Bを、IF条件のどれにも当てはまらないならSQL文Cを実行します。elseifは複数記述が可能で、入れ子にすることもできます。

なお、DBMSによっては、elseifがelsifのケースがあるので注意が必要です。

以下は、MySQLのストアドファンクション内での使用例です。

DELIMITER //
CREATE FUNCTION CheckNULL(name varchar(30)) 
RETURNS VARCHAR(20)
BEGIN 
	declare msg varchar(20);
	declare depname varchar(20);

	select dept_name into depname from departments where dept_no=num;

	if depname IS NULL then set msg = 'NULL';
	else set msg=depname;
	END IF;

END
DELIMITER ;

【関連記事】
SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法 

DBMSごとのIF文の構文

Oracleのif文

oracleのPL/SQLは通常のSQL文内でif文を使用できます。以下の形式を使用可能。elseifではなく、elsifになっている点に注意です。

下記はsales(売上)がquota+200以上なら、bonus(ボーナス)をsalary(給与)に加算するSQLです。

SQL> DECLARE
  2    sales  NUMBER(8,2) := 10100;
  3    quota  NUMBER(8,2) := 10000;
  4    bonus  NUMBER(6,2);
  5    emp_id NUMBER(6) := 120;
  6  BEGIN
  7    IF sales > (quota + 200) THEN
  8       bonus := (sales - quota)/4;
  9
 10       UPDATE employees SET salary =
 11         salary + bonus
 12           WHERE employee_id = emp_id;
 13    END IF;
 14  END;
 15  /

PL/SQL procedure successfully completed.

SQL>

参考)Oracle公式ドキュメント:IF文

SQL Serverのif文

SQL ServerのT-SQLは、通常のSQL内でif文を使用できます。

下記は、本日の曜日がSaturdayまたはSundayならWeekendを、そうでなければWeekdayを出力するSQLです。

IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
       SELECT 'Weekend';
ELSE 
       SELECT 'Weekday';

参考)IF…ELSE (Transact-SQL) – SQL Server | Microsoft Docs

MySQLのif文

MySQLでは、ストアドプロシジャまたはストアドファンクション内でのみif文が使用可能です。主要DBMSでは、通常SQL内でif文を使えないのはMySQLのみなんですね。

下記は、ストアドファンクションVerboseCompareに与えられた引数nとmを比較し、等しければequalsを、n>mならis greater thanを、どちらでもなければis less thanをローカル変数sにセットし、n is xxx m ( xxxにはsの値が入る)を出力します。

DELIMITER //

CREATE FUNCTION VerboseCompare (n INT, m INT)
  RETURNS VARCHAR(50)

  BEGIN
    DECLARE s VARCHAR(50);

    IF n = m THEN SET s = 'equals';
    ELSE
      IF n > m THEN SET s = 'greater';
      ELSE SET s = 'less';
      END IF;

      SET s = CONCAT('is ', s, ' than');
    END IF;

    SET s = CONCAT(n, ' ', s, ' ', m, '.');

    RETURN s;
  END //

DELIMITER ;

関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.5.2 IF 構文

また、MySQLにはIF文とは別にif関数というものがあります。機能は簡易的なcase式のようなもので、単一の条件式に対して真の場合と偽の場合とで異なる値を返すことができます。

IF(expr1,expr2,expr3)

使用例は以下の通り。expr1が真ならexpr2を、そうでなければexpr3を返します。

mysql> SELECT IF(1>2,2,3);
        -> 3
mysql> SELECT IF(1<2,'yes','no');
        -> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');

関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.4 制御フロー関数

PostgreSQLのif文

PL/pgSQLでは、if文をそのまま使用可能です。IF-THEN, IF-THEN-ELSE,IF-THEN-ELSE IF, and IF-THEN-ELSIF-THEN-ELSE という4パターンがあります。

シンプルなif文の構造は以下の通り。

IF v_user_id <> 0 THEN
    UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

ELSEやELSIFを組み合わせた例は以下の通り。下記の例では、elseはnumberがどのような値でも実行されないので、else部分は省略可能です。

IF number = 0 THEN
    result := ''zero'';
ELSIF number > 0 THEN 
    result := ''positive'';
ELSIF number < 0 THEN
    result := ''negative'';
ELSE
    -- hmm, the only other possibility is that number IS NULL
    result := ''NULL'';
END IF;

参考)PostgreSQL公式ドキュメント:制御構造

まとめ

ポテパンダの一言メモ
  • if文は、標準SQLではストアドプロシジャやストアドファンクション内でのみ使用可能
  • if文にはelsifやelseで複数の条件を指定可能で、入れ子にすることもできる。
  • DBMSによっては、elseifの場合やelsifの場合がある。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。