添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
纯真的脸盆  ·  python - Numpy ...·  2 年前    · 
不爱学习的手套  ·  EPPlus ...·  2 年前    · 
闷骚的紫菜  ·  把Oracle ...·  2 年前    · 

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 どの条件式にも対応していないときの処理]

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の時に実行する処理
  どの条件式にもあてはまらなかった時に実行する処理
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より小さいです';
    SELECT '想定外のケース';
  END IF;
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を実行しても正常に動作する時と正常に動作しない時もあるため注意が必要です。


Certified TesterAI Testingとは?詳しく解説させていただ Appsurify TestBrainとは?詳しく解説します Autifyとは?詳しく解説させていただきます Google Cloud Certified Professional Clou NoSQLとは?詳しく解説させていただきます Amazon Redshiftとは?詳しく解説させていただきます SQLiteとは?詳しく解説します AIaaS(Artificial Intelligence as a Servi SQL Serverとは?特徴について詳しく解説します MySQLとは?特徴について詳しく解説します