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クエリ内での複雑な条件評価が可能になり、データの柔軟な操作が実現できます。