MySQLでCASE文の実装

MySQLでCASE文の実装

MySQLのCASE文は、条件に基づいて異なる値を返すための制御フロー関数です。
SQL文で条件分岐を行う際に役立ちます。
CASE文には、Searched Case構文とSimple Case構文の2種類があります。

1. Simple Case構文

Simple Case構文は、ある特定の値に基づいて結果を返す場合に使用します。
構文は以下の通りです:

CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ...
  ELSE default_result
END

expressionには評価する値を指定し、各WHEN句ではexpressionと比較する値を指定します。
WHEN句で一致する値が見つかると、対応するresultが返されます。
一致する値が見つからない場合、ELSE句のdefault_resultが返されます。
ELSE句は省略可能で、指定しない場合は一致する値がないとNULLが返されます。

SELECT product_name,
  CASE category_id
    WHEN 1 THEN '電化製品'
    WHEN 2 THEN '衣類'
    WHEN 3 THEN '食料品'
    ELSE 'その他'
  END AS category_name
FROM products;

この例では、category_idの値に基づいてcategory_nameを決定しています。
category_idが1の場合は「電化製品」、2の場合は「衣類」、3の場合は「食料品」を返し、それ以外の場合は「その他」を返します。

2. Searched Case構文

Searched Case構文は、複雑な条件式を使用して結果を返す場合に使用します。
この構文は、各WHEN句に任意の条件を指定できるため、より柔軟な制御が可能です。
構文は以下の通りです:

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ...
  ELSE default_result
END

各WHEN句のconditionは、任意の論理条件を指定できます。
最初に真になるconditionが見つかると、そのresultが返されます。
全ての条件が偽の場合、ELSE句のdefault_resultが返されます。

SELECT employee_name,
  CASE
    WHEN salary > 100000 THEN '高い'
    WHEN salary BETWEEN 50000 AND 100000 THEN '普通'
    ELSE 'その他'
  END AS salary_range
FROM employees;

この例では、salaryの値に基づいてsalary_rangeを決定しています。
salaryが100,000より大きい場合は「高い」、50,000から100,000の間の場合は「普通」、それ以外は「その他」と評価されます。

3. 実際の使用例

CASE文は、条件に基づいて異なる値をカラムに返したい場合や、SELECT文の結果セットを変換したい場合に便利です。
例えば、顧客の状態を数値で管理している場合、CASE文を使用して人間が理解しやすい形式に変換することができます。

SELECT customer_id,
  CASE status
    WHEN 0 THEN 'Inactive'
    WHEN 1 THEN 'Active'
    WHEN 2 THEN 'Pending'
    ELSE 'Unknown'
  END AS status_description
FROM customers;

この例では、statusフィールドの数値を、よりわかりやすいテキストに変換しています。

4. CASE文の注意点

  • CASE文はSQLの標準機能であり、ほとんどのデータベースシステムでサポートされていますが、構文や機能のサポート状況が異なる場合があります。
  • CASE文の評価は上から下に進行します。

最初に真となる条件で結果が返されるため、条件の順序に注意が必要です。

  • ELSE句は省略可能ですが、全ての条件が偽の場合にNULLが返されるため、明示的なELSE句を使用することをお勧めします。

5. 応用例

CASE文は、ORDER BY句やGROUP BY句など、SQL文の他の部分でも使用することができます。
以下は、CASE文を使用して動的にソート順序を変更する例です。

SELECT product_name, price
FROM products
ORDER BY
  CASE
    WHEN price < 50 THEN 1
    WHEN price BETWEEN 50 AND 100 THEN 2
    ELSE 3
  END;

この例では、priceの値に基づいて製品を異なる順序でソートしています。
priceが50未満の場合は最初に表示され、50から100の間の場合はその次に表示され、それ以外は最後に表示されます。

CASE文を使用することで、SQLクエリ内での複雑な条件評価が可能になり、データの柔軟な操作が実現できます。