スポンサーリンク

【SQL】CASE WHENによる条件分岐

記事内に広告が含まれています。

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;

ここでは、departmentexperience_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における条件分岐を実現する重要な機能です。シンプルな条件式から複雑なネストまで幅広く対応できるため、データ操作の柔軟性が大きく向上します。

スポンサーリンク
SQL
著者SNS
タイトルとURLをコピーしました