CASE ... END をマスターして条件分岐処理を効率化
PostgreSQL CASE ... END による複数条件の処理
基本的な構文
CASE
WHEN 条件1 THEN 結果1
WHEN 条件2 THEN 結果2
...
ELSE 結果N
END
CASE
: 条件分岐処理の開始WHEN
: 条件と結果のペアTHEN
: 条件が真の場合に返す結果ELSE
: すべての条件が偽の場合に返す結果 (省略可能)
複数の条件を指定するには、WHEN
句を複数個記述します。
CASE
WHEN 条件1 AND 条件2 THEN 結果1
WHEN 条件3 THEN 結果2
...
ELSE 結果N
END
上記の例では、条件1
と 条件2
が両方とも真の場合にのみ、結果1
が返されます。
演算子と組み合わせて使用
条件式には、演算子や関数などを組み合わせて使用することができます。
CASE
WHEN 年齢 >= 20 THEN "成人"
WHEN 年齢 >= 18 THEN "青年"
ELSE "未成年"
END
上記の例では、年齢
の値に基づいて、"成人"、"青年"、"未成年" のいずれかを返します。
CASE ... END の応用例
- データの分類
- 値の置換
- NULL 値の処理
- 条件に基づいた計算
PostgreSQL の CASE ... END は、条件分岐処理を行うための強力なツールです。複数の条件を組み合わせることで、複雑な処理を記述することができます。
顧客の年齢に基づいて、割引率を決定する
SELECT
CASE
WHEN 年齢 >= 65 THEN 0.2
WHEN 年齢 >= 50 THEN 0.1
ELSE 0
END AS 割引率
FROM 顧客;
- 65歳以上:20%割引
- それ以外:割引なし
商品の在庫状況に基づいて、メッセージを表示する
SELECT
CASE
WHEN 在庫数 > 0 THEN '在庫あり'
ELSE '在庫なし'
END AS メッセージ
FROM 商品;
上記のコードは、商品の在庫状況に基づいて、メッセージを表示します。
- 在庫あり:'在庫あり'
NULL 値を処理する
SELECT
CASE
WHEN 性別 IS NULL THEN '不明'
ELSE 性別
END AS 性別
FROM 顧客;
上記のコードは、性別
列が NULL の場合、'不明' を表示します。
CASE ... END を使用した複雑な処理
SELECT
CASE
WHEN 国籍 = '日本' AND 年齢 >= 20 THEN '成人'
WHEN 国籍 = '日本' THEN '未成年'
ELSE '外国人'
END AS 区分
FROM 顧客;
上記のコードは、国籍
と 年齢
の値に基づいて、顧客を '成人'、'未成年'、'外国人' に分類します。
CASE ... END は非常に汎用性の高い機能です。上記以外にも、さまざまな用途で使用することができます。
PostgreSQL CASE ... END の代替方法
COALESCE 関数は、最初の引数が NULL でない場合は最初の引数を返し、最初の引数が NULL の場合は 2 番目の引数を返す関数です。
SELECT COALESCE(性別, '不明') AS 性別
FROM 顧客;
SELECT IFNULL(性別, '不明') AS 性別
FROM 顧客;
上記のコードは、COALESCE 関数と同様の動作をします。
DECODE 関数は、最初の引数と 2 番目の引数の値を比較し、一致した場合に 3 番目の引数を返し、一致しない場合は 4 番目の引数を返す関数です。
SELECT DECODE(国籍, '日本', '成人', '外国人') AS 区分
FROM 顧客;
上記のコードは、国籍
が '日本' の場合は '成人' を、それ以外の場合は '外国人' を表示します。
CASE WHEN ... THEN ... END は、CASE ... END の簡略版です。
SELECT
CASE WHEN 性別 = '男性' THEN '男性'
WHEN 性別 = '女性' THEN '女性'
ELSE '不明'
END AS 性別
FROM 顧客;
- シンプルな条件分岐処理の場合は、COALESCE 関数や IFNULL 関数を使用すると、コードが簡潔になります。
- 複雑な条件分岐処理の場合は、CASE ... END を使用すると、コードが分かりやすくなります。
- 特定の条件を比較したい場合は、DECODE 関数を使用すると便利です。
PostgreSQL には、条件分岐処理を行うためのさまざまな方法があります。状況に応じて適切な方法を選択することが重要です。
postgresql case