
データベース管理システムにおいて、SQLは非常に強力なツールです。特にMySQLでは、CASE文を使うことで、データの条件に応じた柔軟な処理が可能になります。この記事では、MySQLのCASE文について、さまざまな視点から詳しく解説します。
CASE文の基本構造
CASE文は、SQLクエリ内で条件分岐を行うための構文です。基本的な構造は以下の通りです。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
この構文を使うことで、特定の条件に応じて異なる結果を返すことができます。
CASE文の使用例
単純な条件分岐
例えば、あるテーブルに「年齢」というカラムがあり、年齢に応じて異なるカテゴリを割り当てたい場合、以下のようにCASE文を使用できます。
SELECT
name,
age,
CASE
WHEN age < 20 THEN '未成年'
WHEN age BETWEEN 20 AND 64 THEN '成人'
ELSE '高齢者'
END AS age_category
FROM
users;
このクエリでは、年齢に応じて「未成年」「成人」「高齢者」のいずれかのカテゴリを割り当てています。
複雑な条件分岐
CASE文は、複数の条件を組み合わせることも可能です。例えば、ある商品の価格帯に応じて異なる割引率を適用したい場合、以下のように書くことができます。
SELECT
product_name,
price,
CASE
WHEN price < 1000 THEN price * 0.9
WHEN price BETWEEN 1000 AND 5000 THEN price * 0.85
ELSE price * 0.8
END AS discounted_price
FROM
products;
このクエリでは、価格帯に応じて異なる割引率を適用し、割引後の価格を計算しています。
CASE文の応用例
集計関数との組み合わせ
CASE文は、集計関数と組み合わせることで、より複雑なデータ分析が可能になります。例えば、あるテーブルに「性別」と「年齢」というカラムがあり、性別と年齢層ごとの人数を集計したい場合、以下のように書くことができます。
SELECT
gender,
CASE
WHEN age < 20 THEN '未成年'
WHEN age BETWEEN 20 AND 64 THEN '成人'
ELSE '高齢者'
END AS age_category,
COUNT(*) AS count
FROM
users
GROUP BY
gender, age_category;
このクエリでは、性別と年齢層ごとの人数を集計しています。
サブクエリ内での使用
CASE文は、サブクエリ内でも使用できます。例えば、あるテーブルに「売上」というカラムがあり、売上に応じて異なるランクを割り当てたい場合、以下のように書くことができます。
SELECT
employee_id,
sales,
CASE
WHEN sales > 1000000 THEN 'ゴールド'
WHEN sales BETWEEN 500000 AND 1000000 THEN 'シルバー'
ELSE 'ブロンズ'
END AS sales_rank
FROM
(SELECT
employee_id,
SUM(amount) AS sales
FROM
sales_records
GROUP BY
employee_id) AS subquery;
このクエリでは、売上に応じて異なるランクを割り当てています。
CASE文の注意点
パフォーマンスへの影響
CASE文は非常に便利ですが、複雑な条件分岐を行う場合、パフォーマンスに影響を与える可能性があります。特に大量のデータを扱う場合、CASE文の使用には注意が必要です。
NULL値の扱い
CASE文では、NULL値の扱いに注意が必要です。例えば、以下のクエリでは、ageがNULLの場合、ELSE節が適用されます。
SELECT
name,
age,
CASE
WHEN age < 20 THEN '未成年'
WHEN age BETWEEN 20 AND 64 THEN '成人'
ELSE '高齢者'
END AS age_category
FROM
users;
NULL値を明示的に扱いたい場合、以下のように書くことができます。
SELECT
name,
age,
CASE
WHEN age IS NULL THEN '年齢不明'
WHEN age < 20 THEN '未成年'
WHEN age BETWEEN 20 AND 64 THEN '成人'
ELSE '高齢者'
END AS age_category
FROM
users;
関連Q&A
Q1: CASE文とIF文の違いは何ですか?
A1: CASE文はSQL内で条件分岐を行うための構文で、複数の条件を扱うことができます。一方、IF文はプログラミング言語で使われることが多く、SQLではCASE文が一般的です。
Q2: CASE文で複数の条件を指定する方法は?
A2: CASE文では、複数のWHEN節を指定することで、複数の条件を扱うことができます。各WHEN節は上から順に評価され、最初に真となる条件に対応するTHEN節が実行されます。
Q3: CASE文でELSE節を省略した場合の挙動は?
A3: CASE文でELSE節を省略した場合、どの条件にも該当しない行にはNULLが返されます。ELSE節を明示的に指定することで、デフォルトの値を設定できます。
Q4: CASE文をネストすることは可能ですか?
A4: はい、CASE文はネストすることが可能です。ただし、ネストが深くなると可読性が低下するため、適度な使用が推奨されます。
Q5: CASE文で文字列を扱う際の注意点は?
A5: CASE文で文字列を扱う場合、比較演算子を使うことができますが、文字列の比較は大文字小文字を区別する場合があるため、注意が必要です。必要に応じて、LOWER()やUPPER()などの関数を使って大文字小文字を統一することが推奨されます。