• TOP
  •   
  • コラム
  •   
  • SQLで分岐処理を行うには?~CAS

SQLで分岐処理を行うには?

MySQLなどのデータベースを操作するとき他のプログラミング言語のIF文のように分岐処理を行いたい場合があります。

データベースを操作するにはSQLを使用し、SQLでIF文のように分岐処理を行うにはCASE式を使用します。

また、MySQLのストアドプロシージャとストアドファンクションで、条件分岐にIF文も使用することが可能です。

ここではMySQLを使用時にIF文のように分岐処理を行えるCASE式とMySQLのストアドプロシージャとストアドファンクションでのIF文を使用する方法について説明します。

SQLでCASE式を使用する方法

基本構文

CASE 式 WHEN 条件式1 THEN 条件式1に対応した時の処理
	[WHEN 条件式n THEN 条件式nに対応した時の処理]
	[ELSE どの条件式にも対応していないときの処理]
END

CASE式は式の値と条件式の値を条件式1から比較していき、最初に一致した条件式に対応した処理を行い内容を表示します。

また、ELSEは全ての条件式に対応していない時に処理を行い内容を表示します。

ELSEを省略しどの条件式にも対応しない場合はNULL値を表示します。

サンプルコード

+------+------+-----+------+
| ID   | NAME | AGE | SAL  |
+------+------+-----+------+
| NO.1 | 神崎 |  55 | 6000 |
| NO.2 | 今田 |  50 | 5000 |
| NO.3 | 山内 |  45 | 4500 |
| NO.4 | 田中 |  40 | 4000 |
| NO.5 | 山内 |  35 | 3500 |
| NO.6 | 中田 |  25 | 2500 |
+------+------+-----+------+

上記はsampletbという名前の表でありMySQLを使用しています。

AGEが25の時はSALを1.5倍、35の時は2倍、その他は1.2倍にし表示するというSQLは以下のようになります。

mysql> SELECT ID, NAME, AGE, SAL,
    -> CASE AGE WHEN 25 THEN SAL *1.5
    ->          WHEN 35 THEN SAL *2
    ->          ELSE SAL * 1.2
    -> END NEW_SAL
    -> FROM sampletb;

このSQLを実行すると以下のような結果になります。

実行結果

+------+------+-----+------+---------+
| ID   | NAME | AGE | SAL  | NEW_SAL |
+------+------+-----+------+---------+
| NO.1 | 神崎 |  55 | 6000 |  7200.0 |
| NO.2 | 今田 |  50 | 5000 |  6000.0 |
| NO.3 | 山内 |  45 | 4500 |  5400.0 |
| NO.4 | 田中 |  40 | 4000 |  4800.0 |
| NO.5 | 山内 |  35 | 3500 |    7000 |
| NO.6 | 中田 |  25 | 2500 |  3750.0 |
+------+------+-----+------+---------+

CASE式のENDの後にNEW_SALと記述することで実行結果のようにNEW_SALの列に計算されたものが表示されます。

このようにCASE式を使用することでIF文のような分岐処理を行うことができます。

ストアドプロシージャとストアドファンクションでのIF文を使用する方法

基本構文

IF 条件式1 THEN
  条件式1の時に行う処理
ELSEIF 条件式n THEN
  条件式nの時に実行する処理
ELSE
  どの条件式にもあてはまらなかった時に実行する処理
END IF;

ELSEは省略することができますが、想定しないケースの対処のために記述した方がいいと言われています。

END IFの後ろにはセミコロン(;)が必要となります。

サンプルコード

DELIMITER //
CREATE PROCEDURE sampleif(IN num INT)
BEGIN
  IF num > 2 THEN
    SELECT '3より大きいです';
  ELSEIF num = 2 THEN
    SELECT '2です';
  ELSEIF num < 2 THEN
    SELECT '2より小さいです';
  ELSE
    SELECT '想定外のケース';
  END IF;
END
//
DELIMITER ;

numが0の場合

mysql> call sampleif(0);

+-----------------+
| 2より小さいです |
+-----------------+
| 2より小さいです |
+-----------------+

numが5の場合

mysql> call sampleif(5);

+-----------------+
| 3より大きいです |
+-----------------+
| 3より大きいです |
+-----------------+

END IFの後ろにはセミコロン(;)が必要ですが、MySQLではセミコロンがあるとSQLを即座に実行してしまいます。

そのため、ストアドファンクションの一部としてセミコロンを使用するために一時的に区切り文字を「DELIMITER//」で「//」に切り替えを行っています。

まとめ

SQLの条件分岐について説明しました。

この記事ではMySQLを使用して説明行っているため他のデータベースで同じSQLを実行しても正常に動作する時と正常に動作しない時もあるため注意が必要です。