MySQLのIF関数の使い方!条件に基づいて異なる値を返す

MySQL

MySQLのIF関数は、指定された条件が真(TRUE)か偽(FALSE)かに基づいて、異なる値を返すために使用されます。

これは、プログラミング言語の if-else 文に似ており、データベースのクエリ内で条件分岐を直接行うことができるため、データの整形、レポート作成、特定の値の変換など、多岐にわたる場面で役立ちます。
この記事では、IF 関数の基本的な使い方、NULL値の扱い、ネストした IF 文、そして使用する際の注意点について解説します。

IF関数の基本的な構文

IF関数の基本的な構文は以下の通りです。

IF(condition, value_if_true, value_if_false)
  • condition: 評価する条件式。これは通常、比較演算子(=, >, <, <=, >=, <> または !=)や論理演算子(AND, OR, NOT)を含む式です。
  • value_if_true: condition が真(TRUE)と評価された場合に返される値。
  • value_if_false: condition が偽(FALSE)と評価された場合に返される値。

conditionNULLと評価された場合、value_if_false が返されます。

IF関数の使用例

いくつか具体的な例を見てみましょう。

例1:数値の比較

顧客の年齢が18歳以上かどうかで「成人」か「未成年」を判定します。

SELECT
    customer_name,
    age,
    IF(age >= 18, '成人', '未成年') AS age_group
FROM
    customers;

実行結果は下記のようになります。
age18以上だったら成人と返しています。

customer_name age age_group
山田太郎 25 成人
佐藤花子 16 未成年
田中一郎 40 成人

例2:文字列の比較

製品のステータスが「在庫あり」か「在庫なし」かで表示を切り替えます。

SELECT
    product_name,
    stock_status,
    IF(stock_status = 'In Stock', '購入可能', '品切れ') AS availability
FROM
    products;

実行結果は下記のようになります。
stock_statusIn Stockだったら購入可能と返しています。

product_name stock_status availability
Laptop Pro In Stock 購入可能
Mechanical Keyboard Out of Stock 品切れ
Coffee Beans (Arabica) In Stock 購入可能
Running Shoes Out of Stock 品切れ
Headphones In Stock 購入可能

例3:複数の条件を組み合わせる

ANDOR を使って複数の条件を評価できます。

SELECT
    order_id,
    total_amount,
    status,
    IF(total_amount > 5000 AND status = 'completed', '高額完了', 'その他') AS order_type
FROM
    orders;

実行結果は下記のようになります。
total_amountが5000より大きくて、statuscompletedだったら高額完了と返しています。

order_id total_amount status order_type
1 3500.00 completed その他
2 1200.50 pending その他
3 7800.25 completed 高額完了
4 500.00 cancelled その他

IF関数とNULL値の扱い

IF 関数の conditionNULL と評価された場合、value_if_false が返されます。これは特に重要です。

SELECT IF(NULL, 'TRUE', 'FALSE');
-- 結果: 'FALSE'

また、value_if_truevalue_if_falseNULLを指定することもできます。

SELECT
    item_name,
    price,
    IF(price IS NULL, '価格未設定', price) AS display_price
FROM
    items;

この例では、priceNULLの場合に「価格未設定」と表示し、それ以外の場合は実際の価格を表示します。
実行結果は下記のようになります。

item_name price display_price
Laptop Bag 49.99 49.99
USB Drive 15.00 15.00
Monitor Stand NULL 価格未設定
Webcam 30.00 30.00

IF関数をネストして使用する

IF 関数は、value_if_truevalue_if_false の位置に別の IF関数を記述することで、複数条件の分岐(if-elif-else のような構造)を実現できます。
ただし、複雑になりすぎると可読性が低下するため、そのような場合は CASE文の使用を検討するべきです。

例:成績判定(ネストしたIF)

点数に応じて「優」「良」「可」「不可」を判定します。

SELECT
    student_name,
    score,
    IF(score >= 90, '優',
        IF(score >= 80, '良',
            IF(score >= 70, '可', '不可')
        )
    ) AS grade
FROM
    students;

実行結果は下記のようになります。
scoreが90以上だったら、そうじゃなくてscoreが80以上だったら、そうじゃなくてscoreが70以上だったらというように表示しています。

student_name score grade
Alice 95
Bob 82
Charlie 68 不可
David 75
Eve 90
Frank NULL 不可

IF関数を使う際の注意点

  • データ型の一貫性: value_if_truevalue_if_false は、互いに互換性のあるデータ型であるべきです。MySQLは自動的に型変換を試みますが、予期せぬ結果やエラーを避けるためにも、同じデータ型、または暗黙的に変換可能なデータ型を使用しましょう。
  • 複雑な条件分岐には CASE を推奨: IF 関数は単純な二者択一の条件分岐には適していますが、3つ以上の分岐や複雑な条件が必要な場合は、CASEの方が可読性とメンテナンス性が高まります。

CASE 文の例(上記の成績判定):

SELECT
    student_name,
    score,
    CASE
        WHEN score >= 90 THEN '優'
        WHEN score >= 80 THEN '良'
        WHEN score >= 70 THEN '可'
        ELSE '不可'
    END AS grade
FROM
    students;

このように、CASE 文の方が複数の条件をより分かりやすく記述できます。

  • パフォーマンス: WHERE 句で IF 関数を使用すると、インデックスが利用できなくなる可能性があるため、パフォーマンスに影響を与えることがあります。

具体的な使用例

例1:注文ステータスの表示

orders テーブルに is_paid (BOOLEAN型) と is_shipped (BOOLEAN型) カラムがあるとします。

SELECT
    order_id,
    is_paid,
    is_shipped,
    IF(is_paid AND is_shipped, '配送済み',
        IF(is_paid, '支払い済み(未配送)', '未払い')
    ) AS order_status_display
FROM
    orders;

実行結果は下記のようになります。
is_paidis_shippedが1だった場合に、配送済みとなっています。
is_paidだけが1だったら、支払い済み(未配送)で、どちらも0だったら未払いです。

order_id is_paid is_shipped order_status_display
1 1 1 配送済み
2 0 0 未払い
3 1 0 支払い済み(未配送)
4 1 0 支払い済み(未配送)

例2:製品価格の割引表示

productsテーブルにpricediscount_rateカラム(NULL許容)があるとします。

SELECT
  product_name,
    discount_rate,
    price,
    IF(discount_rate IS NOT NULL AND discount_rate > 0,
       ROUND(price * (1 - discount_rate), 2),
       price
    ) AS final_price
FROM
    products;

実行結果は下記のようになります。
discount_rateに値があった場合は、割引率に応じて、final_priceに割引後価格を表示しています。

product_name discount_rate price final_price
Wireless Mouse 0.10 25.50 22.95
Mechanical Keyboard 0.05 80.00 76.00
Coffee Beans (Arabica) NULL 15.00 15.00
Organic Tea Bags 0.15 8.75 7.44
Designer Backpack NULL 75.00 75.00
Smart Speaker 0.20 99.99 79.99

まとめ

MySQLのIF関数は、クエリ内で条件分岐を行い、条件に基づいて異なる値を返すための関数でした。
単純な二者択一の条件や、結果の値を動的に変更したい場合に非常に便利です。

ただし、複雑な条件分岐にはCASE文の方が適していること、またWHERE句での使用がインデックスの利用に影響を与える可能性があることを理解し、状況に応じて最適な方法を選択しましょう。
IF関数を使いこなすことで、より柔軟で表現力豊かなSQLクエリを作成できるようになります。

コメント