【必読】SQLのIF文|CASEとの違いやDB別の実例を解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年5月)

✔以下の疑問をお持ちの方へ向けた記事です

「SQLのIF関数とは何で、どのように使うのだろうか?」

「SQLのIF関数の使い方を学びたい」

「SQLのIF関数の具体的な使用例を見て理解したい」

✔この記事を読むことで得られる知識

  • SQLのIF関数の基本的な使い方
  • IF関数の応用法
  • SQLのIF関数を用いた具体的な使用例

この記事では、SQLのIF関数の基本的な使い方から、その応用法まで、具体的な例を交えて詳細に説明します。

ぜひ最後までお読みください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

SQLのIFを理解するための基礎知識

まずはSQLとそのIF文について解説します。

SQLとは何か、そしてそのIF文がなぜ重要なのかについて学びましょう。

  • SQLとは
  • SQLのIF文の重要性の説明

SQLとは

SQL(Structured Query Language)は、リレーショナルデータベースを操作するためのプログラミング言語です。

データを検索、挿入、更新、削除するための標準的な手段を提供します。

SQLは幅広く使われており、その理解は情報システムにおける重要なスキルです。

SQLのIF文の重要性の説明

SQLのIF文は、特定の条件下で異なるアクションを実行するための重要なツールです。

さまざまなビジネスロジックを実現するのに役立ちます。

例えば、顧客の年齢に基づいて異なる割引を適用したり、特定の日付以前のレコードだけを削除したりするなどが挙げられます。

構文については、データベース毎に異なりますので、次章より詳しく見ていきましょう。

IF文とは:データベースごとの違い

IF文の定義と使用方法、そしてデータベースごとの構文の違いについて説明します。

さまざまなデータベースのIF文の書き方を学びましょう。

  • IF文の定義
  • IF文の目的と主な使用ケース
  • MySQL、OracleのIF文の構文
  • SQLServerのIF文の構文は「THEN」がない

IF文の定義

IF文は条件付きのコントロールフロー構造で、指定された条件が真である場合(つまり、評価がTRUEである場合)に一連のSQLステートメントを実行します。

条件が偽(つまり、評価がFALSE)である場合、別のステートメントを実行することも可能です。

IF文の目的と主な使用ケース

IF文の主な目的は、特定の条件下で異なるアクションを実行する能力を提供することです。

この機能は、レコードの作成、更新、削除など、データベース操作の多くに直接的に適用されます。

MySQL、OracleのIF文の構文

MySQLとOracleでは、IF文の基本的な構文は次のようになります。

IF condition THEN
// do something

以下の例では、ストアドプロシージャ内でIF文を使用します。

このストアドプロシージャでは、渡された引数が正かどうかを判断し、その結果に応じて異なるアクションを実行します。

DELIMITER //

CREATE PROCEDURE PositiveNumber(IN num INT)
BEGIN
   IF num > 0 THEN
      SELECT 'Positive Number';
   ELSE
      SELECT 'Not a Positive Number';
   END IF;
END //

DELIMITER ;

このストアドプロシージャは、入力値が0より大きい場合(つまり正の場合)に ‘Positive Number’ を表示し、そうでない場合には ‘Not a Positive Number’ を表示します。

このIF文は、入力値が正かどうかを判断するための条件と、その結果に基づいて実行する2つの異なるアクションを定義しています。

WHEN TRUE
ELSE
// do something else
END IF;

ここで、`condition`は評価する条件、`do something WHEN TRUE`は条件が真の場合に実行するステートメント、`do something else`は条件が偽の場合に実行するステートメントです。

SQLServerのIF文の構文は「THEN」がない

一方、SQL ServerのIF文は「THEN」を使用しません。

その代わり、条件後に直接実行するステートメントを記述します。

以下に基本的な構文を示します。

IF condition
// do something WHEN TRUE
ELSE
// do something else

これらの違いを理解することは、データベースシステム間でSQLコードを適応させる能力を向上させます。

IF文の使い方:基本ルールと構文

IF文の基本的な使用方法と一部の具体的なクエリ例をご紹介します。

NULL判定や複数の条件文の指定、またifexists句の使用例などを学びましょう。

  • IF文の基本的な構文と使用法
  • IF文を用いた簡単なクエリ例
  • NULL判定するIF文のサンプルコード
  • 複数の条件文を指定するIF文のサンプルコード
  • IF文のネスト(入れ子)するサンプルコード
  • ifexists句を使って、存在するときのみテーブルやプロシージャをドロップするサンプルコード

IF文の基本的な構文と使用法

基本的なIF文の構文は以下のようになります。

IF condition THEN
// do something WHEN TRUE
ELSE
// do something else
END IF;

この構文では、`condition`に記述された条件がTRUEであれば、THENの後に記述されたSQLステートメントが実行されます。

もし`condition`がFALSEであれば、ELSEの後に記述されたSQLステートメントが実行されます。

IF文を用いた簡単なクエリ例

次に、簡単なクエリ例を見てみましょう。

たとえば、顧客の年齢に応じて異なるメッセージを出力するクエリは次のようになるでしょう。

IF customer_age >= 18 THEN
SELECT 'You are an adult.' as Message
ELSE
SELECT 'You are a minor.' as Message
END IF;

ここでは、以下のようなメッセージが出力されます。

  • 顧客の年齢が18歳以上で「You are an adult.」
  • 18歳未満であれば「You are a minor.」

NULL判定するIF文のサンプルコード

NULL値を判定するためのIF文は以下のようになります。

IF column_name IS NULL THEN
// do something when column is null
ELSE
// do something when column is not null
END IF;

たとえば、employeeテーブルのsalary列がNULLである場合に特定のアクションを実行するためのIF文は次のようになるでしょう。

IF salary IS NULL THEN
   UPDATE employees SET salary = 0
ELSE
   SELECT 'No action needed'
END IF;

この例では、salary列がNULLであればその値を0に更新します。

そうでなければ、’No action needed’というメッセージを出力します。

複数の条件文を指定するIF文のサンプルコード

IF文は複数の条件を指定することも可能です。その場合、IF文は次のような形になります。

IF condition1 THEN
   // do something when condition1 is true
ELSEIF condition2 THEN
   // do something when condition2 is true
ELSE
   // do something when both conditions are false
END IF;

IF文のネスト(入れ子)するサンプルコード

IF文はネスト(入れ子)させることも可能です。

つまり、一つのIF文の中に別のIF文を含めることができます。その場合、IF文は次のような形になります。

IF condition1 THEN
   IF condition2 THEN
      // do something when both condition1 and condition2 are true
   END IF;
ELSE
   // do something when condition1 is false
END IF;

ifexists句を使って、存在するときのみテーブルやプロシージャをドロップするサンプルコード

ifexists句を使うと、指定したテーブルやプロシージャが存在するときのみ、それをドロップ(削除)することが可能です。

その例は次の通りです。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'table_name') 
   DROP TABLE table_name;

ここでは、情報スキーマをクエリして指定したテーブルが存在するかを確認しています。

もし存在すれば、そのテーブルをドロップします。

今回使用するテーブルの紹介

次に、この記事で使用するテーブルとそのデータについて説明します。この情報は後続のサンプルコードの理解に役立ちます。

  • 実例で使用するテーブルのデータを説明

実例で使用するテーブルのデータを説明

この記事で使用するテーブルは、以下のカラムを持つemployeesテーブルとします。

  • id:従業員のID
  • name:従業員の名前
  • age:従業員の年齢
  • salary:従業員の給料

また、サンプルとして以下のデータを想定します:

idnameagesalary
1John285000
2Sarah32NULL
3Mike457000
4LindaNULL6000

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

ストアドプロシージャやストアドファンクションでは、IF文を使ってより複雑な処理をおこなうことが可能です。以下では、その基本的な構文と使用例をご紹介します。

  • 基本構文
  • サンプルコード

基本構文

ストアドプロシージャでのIF文の基本的な構文は次のようになります。

CREATE PROCEDURE procedure_name AS
BEGIN
   IF condition THEN
      // do something when condition is true
   ELSE
      // do something when condition is false
   END IF;
END;

サンプルコード

たとえば、給料がNULLである従業員の給料を更新するストアドプロシージャは以下のようになります。

CREATE PROCEDURE UpdateNullSalaries AS
BEGIN
   IF EXISTS (SELECT * FROM employees WHERE salary IS NULL) THEN
      UPDATE employees SET salary = 0 WHERE salary IS NULL;
   ELSE
      SELECT 'No employees with NULL salary';
   END IF;
END;

このストアドプロシージャでは、salaryがNULLである従業員が存在すればその給料を0に更新します

そうでなければ、「No employees with NULL salary」というメッセージを出力します。

CASE文とIF文の違い

SQLでは、条件分岐を行うためにIF文だけでなくCASE文も使うことができます。

以下では、その違いと各々の使用ケースを詳しく見ていきましょう。

  • CASE文とIF文の定義
  • 呼ばれるタイミングの違い
  • それぞれの使用ケース
  • SQLの条件分岐は、if文よりもcase式が簡単なケースもある

CASE文とIF文の定義

IF文とCASE文の大きな違いは、その構造と使われ方にあります。

IF文は「もし…ならば…そうでなければ…」という形式を持つのに対し、CASE文は一連の条件とそれに対応する結果を列挙する形式を持ちます。

CASEについての記事はこちらです。

呼ばれるタイミングの違い

またCASE文は通常、SELECT、UPDATE、DELETE、INSERTのSQL文の中で使用されます。

それに対し、IF文はストアドプロシージャやストアドファンクション内で使用されることが多いです。

それぞれの使用ケース

IF文は通常、プログラム的な制御フローに使用されます。

つまり、一連のステップを実行する順序を制御したり、特定の条件下で特定のアクションを実行したりします。

一方、CASE文は一般的にデータ操作に使われます。

例えば、特定の条件に基づいて行を更新したり、特定の値に基づいて結果を計算したりします。

SQLの条件分岐は、if文よりもcase式が簡単なケースもある

たとえば、特定の列の値に基づいて他の列の値を計算する場合、CASE文は非常に便利です。以下にその例を示します。

SELECT name,
   CASE 
      WHEN salary IS NULL THEN 'No Salary'
      ELSE 'Has Salary'
   END AS salary_status
FROM employees;

このクエリは、salaryがNULLであるか否かに基づいて、salary_status列の値を決定します。

このようなシナリオでは、CASE文はIF文よりもはるかに簡単かつ直感的です。

IF文の注意点とCASE文との併用

ここでは、IF文を使用する際の注意点と、CASE文との併用について解説します。

  • IF文の使用時に注意する点
  • IF文とCASE文の併用
  • IF文とCASE文の同時使用

IF文の使用時に注意する点

IF文は非常に便利な機能ですが、適切に使用しないと意図しない結果をもたらすことがあります。

特にNULL値を扱う際は注意が必要です。

SQLでは、NULL値は未知または不確定を表すため、他の値と比較すると常にNULLを返します。

これは、IF文の条件にNULL値が含まれると、その条件が成立しない可能性があるということを意味します。

そのため、NULL値を適切に扱うための関数(例えば、IS NULLやIS NOT NULL)を使用することが重要です。

IF文とCASE文の併用

IF文とCASE文は、一緒に使用することでさまざまなシナリオをカバーできます。

たとえばストアドプロシージャ内での複雑な条件分岐にIF文を使用し、一方でSELECT文内での単純な値の変換にはCASE文を使用する、というようにです。

IF文とCASE文の同時使用

IF文とCASE文は、同じクエリ内で同時に使用することも可能です。

これにより、より複雑な条件分岐やデータ操作が可能になります。

ただし、このような高度な使用法は、理解やデバッグが難しくなるため注意が必要です。

IF文を使ったクイズ

ここまでの学習内容を確認するため、いくつかのIF文に関するクイズをご紹介します。

  • 知識を確認するためのIF文に関するクイズ

知識を確認するためのIF文に関するクイズ

  1. MySQLとOracleのIF文の基本的な構文は何ですか?
  2. IF文は何のために使われますか?
  3. NULLを含む条件をIF文で評価する際の注意点は何ですか?
  4. ストアドプロシージャでIF文を使用する主な目的は何ですか?
  5. IF文とCASE文の主な違いは何ですか?

まとめ

当記事では、SQLのIF文の基本的な使用法とその重要性を学びました。

また、ストアドプロシージャやストアドファンクションでのIF文の使用方法、さらにはCASE文との違いと併用についても解説しました。

これらの知識は、データ操作と分析のスキルを高めるために重要です。

タイトルとURLをコピーしました