

たまに使うと、構文エラーを連発してしまうSQLのif文。
「どうだったっけ?」と迷った時のために、コピペで実行結果を確認できる、SQLのif文サンプルコードをご紹介します。
※サンプルコードは、MySQL用です。
SQLのif文の書き方は、データベースごとに異なる
SQLのif文の構文は、主要データベースだけでも微妙に書き方が異なります。
MySQL、Oracleのif文の構文
1 2 3 4 |
IF 条件式 THEN 処理文 ELSEIF 条件文 THEN 処理文 ELSE 処理文 END IF |
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.6.5.2 IF 構文
なお、MySQLのIFステートメントは、ストアドプロシージャまたはストアドファンクション内でのみ使用可能です。
SQL Serverのif文の構文は「THEN」がない
1 2 3 4 5 |
IF 条件式 処理文 ELSE IF 条件文 処理文 ELSE 処理文 |
SQL Serverの場合は、「THEN」がありません。また、「ELSEIF」は、「ELSE IF」という記述になります。
IF文の終わりを示す「END IF」がないため、処理分が複数行ある場合は「BEGIN」と「END」で処理文を囲む必要があります。
IF…ELSE (Transact-SQL) – SQL Server | Microsoft Docs
SQLのif文のサンプルコード
以下に、コピペで動作を確認できるSQLサンプルコードをご紹介いたします。
データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用。
SQLのif文でNULL判定するサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 ; |
サンプルデータベースemployeesのテーブルdepartmentsを、与えられた引数「name」で検索し、dept_name(部署名)がNULLだったら「NULL」、それ以外なら部署名を返すストアドファンクションです。
departmentsテーブルの中身は以下の通り。

departmentテーブル
引数にd001(Marketing)を指定して実行した結果は以下の通り。
1 |
SET @p0='d001'; SELECT `CheckNULL`(@p0) AS `CheckNULL`; |

d001を指定した実行結果
引数にd010(存在しない部署ID)を指定して実行した結果は以下の通り。
1 |
SET @p0='d010'; SELECT `CheckNULL`(@p0) AS `CheckNULL`; |

d010を指定した実行結果
場合によっては、NULLの場合は別の値を返すIFNULL関数を使ったほうが、処理が簡単な場合もあります。Oracle、SQL Serverでは、NVL()という関数が用意されています。
SQLのif文でSwitch文のように複数の条件文を指定するには、if文を並べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
DELIMITER // CREATE FUNCTION Switch(num varchar(20)) RETURNS VARCHAR(20) BEGIN declare msg varchar(20); if num = "1" THEN # 処理1 set msg = "case 1"; end IF; if num = "2" THEN # 処理2 set msg = "case 2"; end IF; if num = '3' THEN # 処理3 set msg = 'case 3'; end IF; # 処理4 if num = '4' THEN set msg = 'case 4'; end IF; # else それ以外の処理 if num not in ('1','2','3','4') THEN set msg = 'それ以外'; end if; return msg; END // DELIMITER ; |
引数によって、処理する内容を変えたい場合、C言語やJavaっぽくSwitch文のようにコードを書きたくなりますよね。
if文を単純に並べることで、それっぽく記述することができます。
SQLのIF文のネスト(入れ子)するサンプルコード
さらに複雑に、特定の条件下で別のif文を使いたい場合は、入れ子にすることが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DELIMITER // CREATE FUNCTION NameSearchNest ( name VARCHAR(30)) RETURNS VARCHAR(20) BEGIN declare cnt int; declare msg varchar(20); select count(*) into cnt from employees where employees.first_name=name; if cnt > 0 then set msg=cnt; if cnt > 100 then set msg=concat(msg,'(too many)'); end if; else set msg='Not Found'; end if; return msg; |
上記のコードは、employeesテーブルにて、first_nameと引数nameが等しいレコードをカウントし、件数を返します。100件以上なら、「(too many)」を件数の後ろに付加し、0件なら「Not Found」を返します。
引数に「Kyoichi」を指定した実行結果。251人も居る!

Kyoichiを指定した実行結果
引数に「Taro」を指定した実行結果。一人も居ない。

Taroを指定した実行結果
なお、2012年頃のブログに「MySQLのIF文の入れ子にインデント(字下げ)を入れたらエラーになった」という情報がありました。
MySQLのストアドプロシージャでIF文のインデントはNGぽい – Big Bang
最新のMySQLでは、インデントを入れても全く問題ありませんでした。古いMySQLではインデントに関する不具合があったのかも知れません。
if exists句を使って、存在するときのみテーブルやプロシージャをドロップする
同じifでも全くの別物で「if exists句」があります。
テーブルやプロシージャをcreateするSQL内で、「もしすでにテーブルやプロシージャが存在したらdrop」という処理をする際に良く使われます。
以下、テーブル「dtable」が存在する場合のみ、dtableをdropするSQLです。
1 |
drop table if exists dtable; |
SQLの条件分岐は、 if文よりもcase式が簡単なケースもある
SQLのif文は、バッチ処理的な条件分岐に向いています。しかし、一つのSQL内で、データによって処理内容を変えたい場合などは、case式を使うほうがはるかに簡単です。
関連)SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ

ポテパンが提供するサービスについて
本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。
ポテパンフリーランス
.png)
フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。
ポテパンキャリア
.png)
エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。
ポテパンキャンプ

ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料25万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。
株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

関連記事

MySQLは、SQLに「;」(セミコロン)が出現すると、問答無用でSQLを実行する仕様になっています。
ここでは、ストアドファンクションの一部としてセミコロンを使いたいため、一時的に区切り文字を「DELIMITER //」で、「//」に切り替えています。