SQLのCASE ELSE文は、条件分岐を実装するための強力な機能です。基本的な構文は以下のようになります:
CASE
WHEN 条件1 THEN 結果1
WHEN 条件2 THEN 結果2
...
ELSE デフォルト結果
END
この構文を使うことで、複数の条件に基づいて異なる結果を返すことができます。CASE文は主にSELECT文で使用されますが、UPDATE文やINSERT文でも活用できます。
以下は、学生の点数に基づいて成績を判定する簡単な例です:
SELECT
学生名,
点数,
CASE
WHEN 点数 >= 90 THEN 'A'
WHEN 点数 >= 80 THEN 'B'
WHEN 点数 >= 70 THEN 'C'
WHEN 点数 >= 60 THEN 'D'
ELSE 'F'
END AS 成績
FROM
学生テーブル
この例では、点数に応じて成績をA、B、C、D、Fのいずれかに分類しています。ELSEは、どの条件にも当てはまらない場合のデフォルト値を指定するために使用されています。
CASE ELSE文は、単純な条件分岐だけでなく、より複雑な条件分岐にも対応できます。複数の条件を組み合わせたり、サブクエリを使用したりすることで、高度な分岐処理を実現できます。
以下は、社員の部署と勤続年数に基づいて給与を計算する例です:
SELECT
社員名,
部署,
勤続年数,
CASE
WHEN 部署 = '営業' AND 勤続年数 >= 5 THEN 基本給 * 1.2
WHEN 部署 = '営業' THEN 基本給 * 1.1
WHEN 部署 = '開発' AND 勤続年数 >= 3 THEN 基本給 * 1.15
WHEN 部署 = '開発' THEN 基本給 * 1.05
ELSE 基本給
END AS 計算後給与
FROM
社員テーブル
この例では、部署と勤続年数の組み合わせに基づいて、基本給に対する倍率を変更しています。複数の条件を組み合わせることで、より細かな条件分岐が可能になります。
また、CASE文の中でサブクエリを使用することもできます:
SELECT
商品名,
価格,
CASE
WHEN 価格 > (SELECT AVG(価格) FROM 商品テーブル) THEN '高価'
WHEN 価格 < (SELECT AVG(価格) FROM 商品テーブル) THEN '安価'
ELSE '平均的'
END AS 価格評価
FROM
商品テーブル
この例では、サブクエリを使用して商品の平均価格を計算し、各商品の価格がそれよりも高いか低いかを判断しています。
CASE文におけるELSE句は、すべての条件に当てはまらない場合のデフォルト値を指定するために使用されます。しかし、ELSE句は必須ではなく、省略することも可能です。
ELSE句を省略した場合、どの条件にも当てはまらないレコードに対してはNULL値が返されます。以下は、ELSE句を省略した例です:
SELECT
商品名,
在庫数,
CASE
WHEN 在庫数 > 100 THEN '十分'
WHEN 在庫数 > 50 THEN '普通'
WHEN 在庫数 > 0 THEN '要注意'
END AS 在庫状況
FROM
商品テーブル
この例では、在庫数が0以下の商品に対しては在庫状況がNULLとなります。
ELSE句を省略するかどうかは、ビジネスロジックや後続の処理によって判断します。NULLを許容できない場合や、すべての場合に対して明示的な値を設定したい場合は、ELSE句を使用することをおすすめします。
CASE ELSE文は集計関数と組み合わせることで、より高度なデータ分析や集計が可能になります。特に、COUNT、SUM、AVGなどの集計関数とCASE文を組み合わせることで、条件付きの集計を行うことができます。
以下は、商品カテゴリごとの高額商品と低額商品の数を集計する例です:
SELECT
カテゴリ,
COUNT(CASE WHEN 価格 >= 10000 THEN 1 END) AS 高額商品数,
COUNT(CASE WHEN 価格 < 10000 THEN 1 END) AS 低額商品数
FROM
商品テーブル
GROUP BY
カテゴリ
この例では、CASE文を使って価格が10,000円以上の商品と10,000円未満の商品を分類し、それぞれの数をカテゴリごとに集計しています。
また、SUM関数とCASE文を組み合わせることで、条件付きの合計を計算することもできます:
SELECT
部署,
SUM(CASE WHEN 性別 = '男性' THEN 給与 ELSE 0 END) AS 男性給与合計,
SUM(CASE WHEN 性別 = '女性' THEN 給与 ELSE 0 END) AS 女性給与合計
FROM
社員テーブル
GROUP BY
部署
この例では、部署ごとに男性と女性の給与合計を別々に計算しています。
CASE文と集計関数の組み合わせは、ピボットテーブルのような複雑な集計結果を得るのにも有効です。
CASE ELSE文は非常に便利な機能ですが、大量のデータを処理する場合はパフォーマンスに注意が必要です。以下に、CASE ELSE文を使用する際のパフォーマンス最適化のコツをいくつか紹介します。
CREATE INDEX idx_商品_価格 ON 商品テーブル(価格)
CASE
WHEN 最も頻繁な条件 THEN 結果1
WHEN 2番目に頻繁な条件 THEN 結果2
...
ELSE デフォルト結果
END
SELECT
商品名,
CASE
WHEN カテゴリ = '食品' THEN
CASE
WHEN 価格 < 1000 THEN '安価な食品'
WHEN 価格 >= 1000 AND 価格 < 5000 THEN '中価格帯の食品'
ELSE '高価な食品'
END
WHEN カテゴリ = '電化製品' THEN
CASE
WHEN 価格 < 10000 THEN '安価な電化製品'
WHEN 価格 >= 10000 AND 価格 < 50000 THEN '中価格帯の電化製品'
ELSE '高価な電化製品'
END
ELSE '他のカテゴリ'
END AS 価格評価
FROM
商品テーブル
CREATE MATERIALIZED VIEW 商品価格評価 AS
SELECT
商品ID,
CASE
WHEN 価格 < 1000 THEN '安価'
WHEN 価格 >= 1000 AND 価格 < 10000 THEN '中価格'
ELSE '高価'
END AS 価格評価
FROM
商品テーブル
これらの最適化テクニックを適切に組み合わせることで、CASE ELSE文を使用した複雑なクエリのパフォーマンスを大幅に向上させることができます。
インデックスの適切な使用方法についての詳細な情報はこちらを参照してください。
SQLのCASE ELSE文は、データベース操作において非常に強力かつ柔軟なツールです。基本的な条件分岐から複雑な集計処理まで、幅広い用途に活用できます。しかし、その使用には適切な設計と最適化が不可欠です。本記事で紹介した基本的な使い方や応用テクニック、パフォーマンス最適化のコツを参考に、効果的なSQLクエリの作成に役立ててください。
CASE ELSE文の活用は、データベース設計やクエリ最適化の重要な一部となっています。適切に使用することで、複雑なビジネスロジックをデータベースレベルで実装し、アプリケーションのパフォーマンスと保守性を向上させることができます。今後のデータベース設計やSQLクエリ作成の際には、CASE ELSE文の特性を十分に理解し、状況に応じて適切に活用することが重要です。
最後に、CASE ELSE文は単なる条件分岐のツールではなく、データの意味や関係性を表現するための強力な手段でもあります。データモデリングやビジネスルールの実装において、CASE ELSE文の創造的な使用を検討することで、より洗練されたデータベースソリューションを構築できるでしょう。常に新しい使い方や最適化の方法を探求し、データベース技術の進化に合わせてスキルを磨いていくことが、優れたデータベース専門家への道となります。