SQLのCASE
文は、条件に基づいて異なる値を返す際に使用される構文です。
IF-THEN-ELSE
のような条件分岐を行うために役立ち、データベースクエリでの柔軟なデータ操作が可能になります。
以下では、CASE
文の基本的な使い方から応用的な使用方法までまとめます。
CASE文の基本構文
CASE
文には主に2つの形式があります。
単純CASE式
特定の値を評価して、該当する場合に値を返します。
CASE column_name WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END
column_name
は評価する列です。
value1
, value2
などの値と一致するかを確認します。
一致した場合、対応する result
を返します。
ELSE
はどの条件にも一致しない場合のデフォルト値を指定します(省略可能)。
検索CASE式
条件を個別に指定して評価します。
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END
condition1
, condition2
は評価する条件式です。
条件が真 (TRUE
) の場合、対応する result
を返します。
ELSE
はどの条件にも一致しない場合のデフォルト値を指定します(省略可能)。
単純CASE式の例
従業員テーブルにおいて、department
列の値に基づいて異なる部門名を返す例を示します。
SELECT employee_name,
department,
CASE department
WHEN 'HR' THEN 'Human Resources'
WHEN 'IT' THEN 'Information Technology'
WHEN 'FIN' THEN 'Finance'
ELSE 'Other'
END AS department_name
FROM employees;
このクエリでは、department
の値に応じて部門名が表示され、該当しない場合は “Other” が返されます。
検索CASE式の例
売上テーブルにおいて、売上金額 (sales_amount
) に応じて異なる評価 (High
, Medium
, Low
) を設定します。
SELECT sale_id,
sales_amount,
CASE
WHEN sales_amount >= 10000 THEN 'High'
WHEN sales_amount >= 5000 THEN 'Medium'
ELSE 'Low'
END AS sales_level
FROM sales;
このクエリでは、sales_amount
が 10,000 以上の場合は “High”、5,000 以上 10,000 未満の場合は “Medium”、それ以外は “Low” が返されます。
CASE文のネスト
CASE
文を入れ子にすることで、複雑な条件を扱うことも可能です。
SELECT employee_name,
department,
CASE
WHEN department = 'HR' THEN
CASE
WHEN experience_years > 5 THEN 'Senior HR'
ELSE 'Junior HR'
END
WHEN department = 'IT' THEN
CASE
WHEN experience_years > 5 THEN 'Senior IT'
ELSE 'Junior IT'
END
ELSE 'Other'
END AS position
FROM employees;
ここでは、department
と experience_years
に基づいて従業員のポジションを分類しています。
CASE文の実用例
グループ集計との組み合わせ
売上データの分析で、売上額の区間ごとに集計する場合、CASE
文を使って集計グループを作成できます。
SELECT
CASE
WHEN sales_amount >= 10000 THEN 'High'
WHEN sales_amount >= 5000 THEN 'Medium'
ELSE 'Low'
END AS sales_level,
COUNT(*) AS count_of_sales
FROM sales
GROUP BY
CASE
WHEN sales_amount >= 10000 THEN 'High'
WHEN sales_amount >= 5000 THEN 'Medium'
ELSE 'Low'
END;
このクエリでは、売上レベルごとの販売件数を集計します。
集計関数内の条件分岐
CASE
文を使用して、売上額が特定の条件を満たす場合にのみ集計を行う例です。
以下のクエリでは、売上額が10,000以上の場合の合計を「High Sales」、5,000以上10,000未満の場合を「Medium Sales」として集計し、それ以外は「Low Sales」に分類します。
SELECT
SUM(CASE WHEN sales_amount >= 10000 THEN sales_amount ELSE 0 END) AS high_sales,
SUM(CASE WHEN sales_amount >= 5000 AND sales_amount < 10000 THEN sales_amount ELSE 0 END) AS medium_sales,
SUM(CASE WHEN sales_amount < 5000 THEN sales_amount ELSE 0 END) AS low_sales
FROM sales;
このクエリでは、sales_amount
が条件を満たす場合にのみその値を合計します。
それ以外の場合には0
を加えるため、特定の条件に基づいた売上集計が可能です。
フラグの設定
条件に応じてフラグを設定することも可能です。
SELECT product_name,
sales_amount,
CASE
WHEN sales_amount > 10000 THEN 1
ELSE 0
END AS is_high_sales
FROM products;
売上額が10,000を超える製品にはフラグ 1
を、それ以外には 0
を設定します。
注意点
CASE
文は、複数の条件を評価する場合に便利ですが、条件が複雑になりすぎると可読性が低下する可能性があります。その場合は、ビューやサブクエリを使ってコードを整理することを検討した方がよいです。ELSE
がない場合、すべての条件が満たされなければNULL
が返されますので、特定のデフォルト値を設定したい場合はELSE
句を使用します。
まとめ
CASE
文は、SQLにおける条件分岐を実現する重要な機能です。シンプルな条件式から複雑なネストまで幅広く対応できるため、データ操作の柔軟性が大きく向上します。