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)と評価された場合に返される値。
conditionがNULLと評価された場合、value_if_false が返されます。
IF関数の使用例
いくつか具体的な例を見てみましょう。
例1:数値の比較
顧客の年齢が18歳以上かどうかで「成人」か「未成年」を判定します。
SELECT
customer_name,
age,
IF(age >= 18, '成人', '未成年') AS age_group
FROM
customers;
実行結果は下記のようになります。
ageが18以上だったら成人と返しています。
| customer_name | age | age_group |
|---|---|---|
| 山田太郎 | 25 | 成人 |
| 佐藤花子 | 16 | 未成年 |
| 田中一郎 | 40 | 成人 |
例2:文字列の比較
製品のステータスが「在庫あり」か「在庫なし」かで表示を切り替えます。
SELECT
product_name,
stock_status,
IF(stock_status = 'In Stock', '購入可能', '品切れ') AS availability
FROM
products;
実行結果は下記のようになります。
stock_statusがIn 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:複数の条件を組み合わせる
AND や OR を使って複数の条件を評価できます。
SELECT
order_id,
total_amount,
status,
IF(total_amount > 5000 AND status = 'completed', '高額完了', 'その他') AS order_type
FROM
orders;
実行結果は下記のようになります。
total_amountが5000より大きくて、statusがcompletedだったら高額完了と返しています。
| 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 関数の condition が NULL と評価された場合、value_if_false が返されます。これは特に重要です。
SELECT IF(NULL, 'TRUE', 'FALSE');
-- 結果: 'FALSE'
また、value_if_trueやvalue_if_falseにNULLを指定することもできます。
SELECT
item_name,
price,
IF(price IS NULL, '価格未設定', price) AS display_price
FROM
items;
この例では、priceがNULLの場合に「価格未設定」と表示し、それ以外の場合は実際の価格を表示します。
実行結果は下記のようになります。
| 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_true や value_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_trueとvalue_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_paidとis_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テーブルにpriceとdiscount_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クエリを作成できるようになります。

コメント