【SQL実践|実務向け】SQLの条件分岐をマスターする!CASE句による動的なデータ変換テクニック

1. 導入

データベース管理者として現場で頻繁に直面するのが、「取得するデータを、特定の条件に基づいて変換したい」という要望です。例えば、「テストの点数を評価ランクに変換したい」「地域コードを営業担当者の名前に置き換えたい」といったケースです。アプリケーション側でロジックを組むことも可能ですが、SQLのCASE句を活用すれば、データベースから取得する時点でデータを整形できるため、コードの簡素化やネットワーク転送量の削減、そして集計処理の高速化に直結します。

2. 基礎知識

SQLにおけるCASE句は、プログラムにおける「if-else」や「switch」文に相当する制御構文です。大きく分けて「検索CASE式」と「単純CASE式」の2種類があります。
・検索CASE式:WHEN句に比較演算子(>、<、=など)を使った柔軟な条件を指定できる。 ・単純CASE式:対象の式と、WHEN句で指定した値を比較して一致するかどうかを判定する。 どちらも結果として単一の値を返すため、SELECT句だけでなく、ORDER BY句やGROUP BY句での集計条件としても利用可能です。

3. 実装/解決策

実務では、単に値を変換するだけでなく、AS句(エイリアス)を組み合わせて、結果セットに分かりやすいカラム名を付けるのが定石です。以下に、検索CASE式を用いた「スコア評価」と、単純CASE式を用いた「地域別担当者割り当て」のサンプルを示します。

4. サンプルプログラム

— 1. 検索CASE式:スコアに応じた評価ランクの付与
— 範囲指定が必要な場合に非常に便利です
SELECT
name,
result,
CASE
WHEN result >= 90 THEN ‘S’
WHEN result >= 70 THEN ‘A’
WHEN result >= 50 THEN ‘B’
ELSE ‘C’
END AS evaluation — 評価結果をevaluationカラムとして出力
FROM test;

— 2. 単純CASE式:特定の値に対するマッピング
— カテゴリの割り当てや固定値の変換に最適です
SELECT
name,
address,
CASE address
WHEN ‘Tokyo’ THEN ‘Sales_Dept_1’
WHEN ‘Osaka’ THEN ‘Sales_Dept_2’
ELSE ‘General_Support’
END AS sales_division — 営業部署をマッピングして出力
FROM user;

5. 応用・注意点

CASE句を扱う上で、現場で特に注意すべきポイントが3つあります。

1. NULLの扱い:単純CASE式において、比較対象がNULLの場合、直接’WHEN NULL’としても評価されません。NULLを判定したい場合は、IS NULL演算子が使える「検索CASE式」を使用してください。
2. ELSE句の重要性:ELSE句を省略した場合、どの条件にも合致しないデータはNULLとなります。予期せぬNULLを避けるため、デフォルト値を必ず定義する癖をつけましょう。
3. パフォーマンスへの影響:CASE句内で複雑な計算やサブクエリを多用すると、インデックスが効かなくなり、クエリの実行計画が悪化する可能性があります。大量データを扱うテーブルでは、実行計画(EXPLAIN)を確認しながら記述することを推奨します。

これらを意識するだけで、SQLによるデータ変換の品質が劇的に向上します。ぜひ日々の運用で活用してください。

コメント

タイトルとURLをコピーしました