PostgreSQLで条件分岐!CASE文の使い方を徹底解説

データベースを使用していると、「条件に応じて異なる値を返したい」「特定の条件に基づいてデータを分類したい」といったニーズが頻繁に出てきます。PostgreSQLでは、このような条件分岐処理を柔軟に実現するために、CASE文が用意されています。

CASE文を使うことで、SQLクエリ内で動的に条件を評価し、指定した値を返すことができます。これにより、複雑なデータ処理や分析が可能になります。本記事では、CASE文の基本的な使い方から応用例までをわかりやすく解説していきます。

SQL初心者や中級者の方を対象に、具体例を交えながら解説しますので、ぜひ最後までお付き合いください!

CASE文の基本構文

CASE文は、条件分岐処理をSQL文内で簡潔に記述するための構文です。条件に応じた値を返すだけでなく、データを分類したり計算したりする際にも役立ちます。以下に、CASE文の基本構文を示します。

CASE
    WHEN 条件1 THEN 結果1
    [WHEN 条件2 THEN 結果2 ...]
    [ELSE 結果N]
END
  • WHEN 条件 THEN 結果
    条件が満たされた場合に返す値を指定します。
  • ELSE 結果
    どの条件にも一致しない場合に返す値を指定します(省略可)。
  • END
    CASE文の終了を明示します。

例として、商品の在庫数に基づいて在庫状況を「多い」「普通」「少ない」に分類する場合、次のように記述します。

SELECT product_name,
       CASE
           WHEN stock_quantity > 100 THEN '多い'
           WHEN stock_quantity BETWEEN 50 AND 100 THEN '普通'
           ELSE '少ない'
       END AS stock_status
FROM products;

このクエリでは、在庫数が100を超える商品は「多い」、50から100の間は「普通」、それ以外は「少ない」として分類されます。

SELECT文でのCASEの使い方

CASE文は、SELECT文でデータを取得しながら条件に応じた値を動的に生成する際に非常に便利です。ここでは、CASE文をSELECT文で活用する具体例を見ていきます。

まずは以下のような「売上情報」を管理するテーブルを用意します。

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    product VARCHAR(50),
    quantity INT,
    price DECIMAL
);

INSERT INTO sales (product, quantity, price) VALUES
('Apple', 10, 1.5),
('Banana', 5, 1.0),
('Cherry', 20, 2.0);

このテーブルには、商品名 (product)、数量 (quantity)、価格 (price) の情報が含まれています。

条件に応じた分類をする

商品の数量に基づいて、在庫状況を分類してみましょう。

SELECT product,
       quantity,
       CASE
           WHEN quantity >= 15 THEN '在庫多め'
           WHEN quantity BETWEEN 5 AND 14 THEN '在庫普通'
           ELSE '在庫少なめ'
       END AS stock_status
FROM sales;

このクエリでは、quantity の値を条件として評価し、在庫状況を「在庫多め」「在庫普通」「在庫少なめ」の3つに分類します。結果は次のようになります。

計算結果を動的に表示する

数量 (quantity) と価格 (price) を掛け算して売上金額を計算し、売上が一定額以上かどうかを分類する例を示します。

SELECT product,
       quantity,
       price,
       quantity * price AS revenue,
       CASE
           WHEN quantity * price >= 20 THEN '高収益商品'
           ELSE '低収益商品'
       END AS revenue_category
FROM sales;

このクエリでは、売上金額を計算し、それに基づいて「高収益商品」または「低収益商品」に分類します。結果は以下のようになります。

CASE文は、SELECT文でデータを分類、評価、または計算結果を動的に生成する際に非常に役立ちます。この基本をマスターすることで、複雑なクエリにも対応できるようになるでしょう!

UPDATE文でのCASEの使い方

CASE文は、データを条件に基づいて柔軟に更新する場合にも活躍します。UPDATE文と組み合わせることで、条件に応じた値でデータを更新することができます。ここでは、その使い方を具体例を通じて解説します。

例として、商品ごとに異なる条件で価格を調整する例を見ていきましょう。

UPDATE sales
SET price = CASE
                WHEN product = 'Apple' THEN price * 1.1
                WHEN product = 'Banana' THEN price * 1.2
                ELSE price * 1.05
            END;

実行結果

UPDATE文とCASE文のポイント

  • 柔軟性
    条件に応じた複雑な更新処理が可能です。
  • パフォーマンス
    WHERE句と組み合わせて対象を絞ると、効率的に更新できます。
  • 可読性
    複数の条件がある場合は、順序やロジックが明確になるようコメントやフォーマットを工夫しましょう。

CASE文をUPDATE文で活用することで、手動のデータ変更作業を自動化でき、効率的なデータ管理が実現できます!

CASE文をネストして使う

CASE文は単純な条件分岐だけでなく、さらに複雑な条件を記述するためにネスト(入れ子構造)を利用することもできます。ネストしたCASE文を使うことで、多段階の条件評価を1つのクエリ内で実現できます。

ネストしたCASE文は、WHEN句やTHEN句の中にさらに別のCASE文を埋め込む形で記述します。

CASE
    WHEN 条件1 THEN
        CASE
            WHEN サブ条件1 THEN 結果1
            ELSE 結果2
        END
    ELSE 結果3
END

この構文を使うことで、1つのCASE文の中でさらに条件を細かく評価できます。

例えば、商品の価格と数量に基づいて商品カテゴリを細かく分類する場合、以下のようにネストしたCASE文を使用します。

SELECT product,
       price,
       quantity,
       CASE
           WHEN price > 2 THEN
               CASE
                   WHEN quantity > 15 THEN 'プレミアム商品'
                   ELSE '高価格商品'
               END
           WHEN price BETWEEN 1 AND 2 THEN
               CASE
                   WHEN quantity > 10 THEN 'お得商品'
                   ELSE '普通商品'
               END
           ELSE '低価格商品'
       END AS product_category
FROM sales;

サンプルデータに基づく結果は以下のようになります。

ネストしたCASE文を使いこなすことで、複雑な条件処理を1つのクエリで記述できるようになります。実務で複数条件が絡むデータ処理を効率化したい場合に特に有用です!

まとめ

PostgreSQLのCASE文は、条件に応じてデータを分類したり、動的な値を生成したりするための強力なツールです。本記事では、基本構文からSELECT文やUPDATE文での活用、さらにネストしたCASE文を用いた高度な使い方までを解説しました。

注意点として、複雑なCASE文を記述する場合は、クエリの可読性やパフォーマンスを意識することが必要です。特に条件が増える場合は、サブクエリやビューの活用も検討しましょう。

CASE文を使いこなせるようになれば、データベース操作の幅が大きく広がります。ぜひ、今回の内容を参考にしながら、実際の業務や学習でCASE文を積極的に活用してみてください!

コメント