PostgreSQLにおけるIF-THEN-ELSE文(CASE式)の具体的な例
PostgreSQLにおけるIF-THEN-ELSE文の解説
PostgreSQLでは、直接的なIF-THEN-ELSE文は提供されていません。しかし、CASE式を用いて同様の条件分岐を実現することができます。
CASE式の基本構文
CASE WHEN condition THEN result
ELSE result
END;
- WHEN condition THEN result: 条件が真の場合、指定された結果を返します。
- ELSE result: 条件が偽の場合、指定された結果を返します。
例: 顧客の年齢に基づいた割引
SELECT customer_id, name, age,
CASE WHEN age >= 60 THEN 'シニア割引'
WHEN age >= 30 THEN '一般割引'
ELSE '学生割引'
END AS discount_type
FROM customers;
このクエリでは、顧客の年齢に基づいて割引の種類を決定し、discount_type
列に格納します。
複数の条件を組み合わせる
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END;
複数の条件を組み合わせることができます。
CASE式を他の式で使用
SELECT customer_id, name, age,
CASE WHEN age >= 60 THEN price * 0.8
WHEN age >= 30 THEN price * 0.9
ELSE price
END AS discounted_price
FROM customers;
CASE式を他の式で使用して、条件に基づいて計算結果を変更することができます。
SELECT customer_id, name, age,
CASE WHEN age >= 60 THEN price * 0.8 -- 60歳以上は80%割引
WHEN age >= 30 THEN price * 0.9 -- 30歳以上は90%割引
ELSE price -- それ以外は通常価格
END AS discounted_price
FROM customers;
- 解説:
CASE WHEN age >= 60 THEN ...
の部分で、年齢が60歳以上の顧客に対して割引率を80%に設定しています。ELSE ...
の部分で、それ以外の年齢の顧客に対しては通常価格を適用しています。
商品のカテゴリに基づいた表示形式の変更
SELECT product_id, name, category,
CASE WHEN category = '食品' THEN '食品: ' || name
WHEN category = '家電' THEN '家電製品: ' || name
ELSE 'その他: ' || name
END AS display_name
FROM products;
- 解説:
CASE WHEN category = '食品' THEN ...
の部分で、カテゴリが「食品」の場合、商品名の前には「食品: 」を付加しています。- 他のカテゴリについても同様に、カテゴリに応じた文字列を商品名の前につけています。
NULL値の処理
SELECT column1,
CASE WHEN column1 IS NULL THEN 'NULL値です'
ELSE '値があります'
END AS is_null
FROM my_table;
- 解説:
- それ以外の場合は「値があります」と表示します。
SELECT * FROM my_table
WHERE
(column1 = 'value1' AND column2 > 10) OR
(column3 IS NULL AND column4 = 'value4');
- 解説:
- 上記の例では、CASE式ではなくWHERE句で複数の条件を組み合わせています。
AND
やOR
を用いて条件を結合することができます。
- CASE式: SQLの標準的な条件分岐の方法です。
- 計算結果を返すことができます。
- WHERE句: 特定の条件に合致するレコードを抽出する際に使用します。
- CASE式と組み合わせて、より複雑な条件を表現できます。
- PL/pgSQL: PostgreSQLの拡張言語で、より高度な制御構造を提供します。
- IF文、ELSE文、ELSIF文などを用いて条件分岐を記述できます。
- CASE式は、SELECT文だけでなく、UPDATE文やDELETE文でも使用できます。
- PL/pgSQLは、複雑なロジックを実装する場合に有効です。
PL/pgSQL関数
- 詳細: PostgreSQLの拡張言語であるPL/pgSQLを用いて、より複雑な条件分岐や手続き型の処理を実装できます。
- メリット:
- IF文、ELSE文、ELSIF文など、一般的なプログラミング言語と同様の制御構造が利用できます。
- 複数のSQL文を組み合わせ、複雑なロジックを実現できます。
- デメリット:
- CASE式に比べて記述が冗長になる場合があります。
- パフォーマンスが若干低下する可能性があります。
例:
CREATE OR REPLACE FUNCTION get_discount(age integer)
RETURNS numeric AS $$
DECLARE
discount numeric;
BEGIN
IF age >= 60 THEN
discount := 0.8;
ELSIF age >= 30 THEN
discount := 0.9;
ELSE
discount := 1.0;
END IF;
RETURN discount;
END;
$$ LANGUAGE plpgsql;
フィルタリング (WHERE句)
- 詳細: WHERE句を用いて、特定の条件に合致するレコードのみを抽出します。
- メリット:
- シンプルな条件分岐に適しています。
- インデックスを活用することで高速な処理が可能です。
- デメリット:
SELECT * FROM customers
WHERE age >= 60; -- 60歳以上の顧客のみ抽出
集計関数とフィルタリング
- 詳細: 集計関数とHAVING句を組み合わせることで、グループごとの条件分岐を実現できます。
- メリット:
- デメリット:
SELECT product_category,
COUNT(*) AS total_products,
SUM(price) AS total_price
FROM products
GROUP BY product_category
HAVING COUNT(*) > 100; -- 製品数が100以上のカテゴリのみ抽出
ウィンドウ関数
- 詳細: ウィンドウ関数を利用して、現在の行とその周辺の行の情報を参照し、条件分岐を実現できます。
- メリット:
- デメリット:
SELECT *,
ROW_NUMBER() OVER (ORDER BY sales DESC) AS rank
FROM sales;
どの方法を選ぶべきか
- 単純な条件分岐: CASE式、WHERE句
- 複雑なロジック: PL/pgSQL関数
- グループごとの集計: 集計関数とHAVING句
- ランキングや順位付け: ウィンドウ関数
PostgreSQLでは、CASE式以外にも様々な方法で条件分岐を実現できます。それぞれの方法にはメリットとデメリットがあるため、処理内容やパフォーマンス、可読性などを考慮して最適な方法を選択することが重要です。
- PL/pgSQLは、トリガーや関数など、より高度な処理を実現するための強力なツールです。
- ウィンドウ関数は、SQLの標準機能ですが、複雑な処理を行うため、習得には時間がかかる場合があります。
sql postgresql