【PostgreSQL】CASE文の書き方|コード付きで徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年7月)

✔このような方へ向けて書かれた記事となります

「PostgreSQLのCASE文は何ができるのだろうか?」
「CASE文の書き方が知りたい」
「PostgreSQLのCASE文の実例が見たい」

✔当記事を通じてお伝えすること

  • PostgreSQLのCASE文の基本
  • CASE文の書き方やその応用
  • PostgreSQLのCASE文の実例

当記事では、PostgreSQLのCASE文の基本だけでなく、そのオプションを活用した使い方まで、具体例を用いて詳しく解説しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

PostgreSQLとは

PostgreSQLは、オープンソースのオブジェクトリレーショナルデータベース管理システム(ORDBMS)のひとつです。

多機能性と拡張性、高い信頼性とパフォーマンスが特徴で、全世界で幅広く利用されています。

CASE式の基本解説

PostgreSQLのCASE式について詳しく説明します。

CASE式は以下の4つの側面から構成されます。

  • シンプルなCASE文
  • Searched CASE文
  • COALESCE関数との違い
  • NULLIF関数との関連性

シンプルなCASE文

シンプルなCASE文は、指定した表現がどの値と等しいかに基づいて、結果を返す構造のこと。

SQLのif文に近い形で、条件分岐を行うことが可能です。

SELECT name,
       age,
       CASE gender
           WHEN 'M' THEN '男性'
           WHEN 'F' THEN '女性'
           ELSE 'その他'
       END AS gender_label
FROM users;

Searched CASE文

Searched CASE文は、各条件が真か偽かに基づいて結果を返します。

一連のブーリアン表現を評価し、最初の真の表現に関連付けられた結果を返すものです。

SELECT name,
       age,
       CASE
           WHEN age < 18 THEN '未成年'
           WHEN age >= 18 AND age < 65 THEN '成人'
           ELSE '高齢者'
       END AS age_group
FROM users;

COALESCE関数との違い

COALESCE関数は、指定した引数のリストから最初の非NULL値を返します。

これはCASE式と異なり、明示的な条件を設定しないため、単純にNULL値を避けたい場合に便利です。

SELECT id, name, COALESCE(nickname, 'No nickname') AS nickname
FROM users;

NULLIF関数との関連性

NULLIF関数は、2つの引数が等しい場合にNULLを返し、そうでない場合は最初の引数を返します。

これは特定の条件下でNULL値を返すSearched CASE文と等価です。

SELECT id, name, NULLIF(age, 0) AS age FROM users;

CASE文の使用例

こちらでは、実際の使用例を見ていきます。

以下の4つの項目に分けて説明します。

  • 基本的な使い方
  • 式を用いた分岐処理
  • 曖昧判定を使ったケース
  • 複数条件による分岐処理

基本的な使い方

CASE文の最も基本的な使用方法は以下の通りです。

たとえば、顧客テーブルからデータを取得し、各顧客の年齢に基づいて「成人」または「未成年」を表示したい場合、CASE文を使用して次のように書くことができます。

SELECT name,
CASE
    WHEN age >= 18 THEN '成人'
    ELSE '未成年'
END as adult_status
FROM customers;

式を用いた分岐処理

条件に複雑な式を含めることも可能です。

例えば、売上テーブルからデータを取得し、商品の売上数に応じて分類を行いたい場合、以下のようなSQL文を書けます。

SELECT product,
CASE
    WHEN sales > 1000 THEN 'ベストセラー'
    WHEN sales > 500 THEN '人気商品'
    ELSE '一般商品'
END as sales_status
FROM sales;

曖昧判定を使ったケース

CASE文は「LIKE」や「IN」などの曖昧な判定にも対応しています。

例えば、顧客の名前に特定の文字列が含まれているかどうかを判定する場合などに使用可能です。

SELECT name,
CASE
    WHEN name LIKE '%Smith%' THEN 'Smith家'
    ELSE 'その他'
END as family
FROM customers;

複数条件による分岐処理

複数の条件に基づく複雑な分岐もCASE文で表現することが可能です。

以下の例では、商品の価格と在庫数によって、商品の販売ステータスを決定しています。

SELECT product,
CASE
    WHEN price < 1000 AND stock > 100 THEN '安価で豊富'
    WHEN price >= 1000 AND stock > 100 THEN '高価で豊富'
    WHEN stock <= 100 THEN '在庫少'
    ELSE 'その他'
END as sales_status
FROM products;

CASE文の応用

CASE文はSQLの各部分、特にUPDATE文やORDER BY句での使用について詳しく説明します。

  • UPDATE文での利用
  • 条件に応じたソート

UPDATE文での利用

CASE文はUPDATE文と組み合わせて、特定の条件に基づいて異なる更新を行うことができます。

たとえば、価格に応じて異なる割引を適用することが可能です。

UPDATE products
SET price = CASE
WHEN price > 10000 THEN price * 0.9 -- 10% discount
WHEN price > 5000 THEN price * 0.95

-- 5% discount
ELSE price
END;

条件に応じたソート

ORDER BY句にCASE文を使用することで、動的なソートを行うことができます。

例えば、特定の顧客を優先的にリストの上に表示するような処理が可能です。

SELECT name FROM customers
ORDER BY
CASE
WHEN name = '特別顧客' THEN 0
ELSE 1
END, name;

このSQL文では、名前が’特別顧客’の行は0を返し、それ以外の行は1を返します。

その結果、’特別顧客’の行が他の行よりも先に表示されます。

まとめ

以上、PostgreSQLのCASE式についての解説と使用例をお伝えしました。

CASE文はSQLの中でも特に強力なツールの一つであり、その理解と活用はデータ分析やデータ操作の効率を大幅に向上させることが可能です。

SQL文はとても柔軟で、CASE文を使用することでその柔軟性がさらに広がります。

ぜひこれらの知識を活用し、より洗練されたSQL文を書くようになりましょう。

SQLにおけるCASE文については、以下の記事でも詳しく解説しています。

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