SQL CASE式の使い方:基礎からUPDATE文での応用まで

2024-04-05

SQL CASE式構文:条件分岐を簡単にする強力なツール

CASE式の基本構成

CASE WHEN 条件1 THEN 結果1
WHEN 条件2 THEN 結果2
ELSE 結果3
END
  • CASE: 条件分岐処理の開始
  • WHEN: 条件
  • THEN: 条件が真の場合に返す結果
  • END: 条件分岐処理の終了

CASE式の例

  • 性別に基づいて敬称を返す
SELECT CASE sex
WHEN 'M' THEN 'Mr.'
WHEN 'F' THEN 'Ms.'
ELSE 'Mx.'
END AS title
FROM users;
  • 年齢に基づいて料金を割引
SELECT CASE age
WHEN 0 <= age AND age < 18 THEN price * 0.5
WHEN 18 <= age AND age < 65 THEN price
ELSE price * 0.8
END AS discounted_price
FROM customers;
  • CASE式を入れ子にする
SELECT CASE status
WHEN 'Shipped' THEN '配送済み'
WHEN 'Pending' THEN
  CASE delivery_method
  WHEN 'Standard' THEN '配送中 (標準)'
  WHEN 'Express' THEN '配送中 (速達)'
  END
ELSE '注文受付中'
END AS status_description
FROM orders;
  • CASE式とその他のSQL関数を組み合わせる
SELECT CASE WHEN price > 100 THEN '高額'
ELSE '低額'
END AS price_category,
UPPER(product_name) AS product_name_upper
FROM products;

CASE式のメリット

  • コードの簡潔化:条件分岐処理をif文で記述するよりも簡潔に書ける
  • 読みやすさの向上:条件分岐処理の流れが分かりやすく、コードの理解が容易
  • 保守性の向上:コードの修正や追加が容易
  • すべての条件を網羅する必要がある
  • ELSE句は省略可能だが、記述することを推奨
  • 複雑な条件分岐処理には不向き

CASE式を使いこなす

CASE式は、条件分岐処理を記述する強力なツールです。CASE式の基本的な構文と応用を理解し、SQLクエリを効率的に記述しましょう。




SELECT
  name,
  CASE sex
    WHEN 'M' THEN 'Mr.'
    WHEN 'F' THEN 'Ms.'
    ELSE 'Mx.'
  END AS title
FROM users;

出力例

| name | title |
|---|---|
| 山田太郎 | Mr. |
| 佐藤花子 | Ms. |
| 田中次郎 | Mx. |
SELECT
  name,
  product_name,
  price,
  CASE age
    WHEN 0 <= age AND age < 18 THEN price * 0.5
    WHEN 18 <= age AND age < 65 THEN price
    ELSE price * 0.8
  END AS discounted_price
FROM customers
JOIN products ON customers.product_id = products.id;
| name | product_name | price | discounted_price |
|---|---|---|---|
| 山田太郎 | ノートパソコン | 10000 | 5000 |
| 佐藤花子 | スマートフォン | 8000 | 8000 |
| 田中次郎 | テレビ | 50000 | 40000 |
SELECT
  name,
  order_id,
  product_name,
  CASE status
    WHEN 'Shipped' THEN '配送済み'
    WHEN 'Pending' THEN
      CASE delivery_method
        WHEN 'Standard' THEN '配送中 (標準)'
        WHEN 'Express' THEN '配送中 (速達)'
      END
    ELSE '注文受付中'
  END AS status_description
FROM orders
JOIN products ON orders.product_id = products.id;
| name | order_id | product_name | status_description |
|---|---|---|---|
| 山田太郎 | 12345 | ノートパソコン | 配送済み |
| 佐藤花子 | 67890 | スマートフォン | 配送中 (標準) |
| 田中次郎 | 23456 | テレビ | 注文受付中 |
SELECT
  name,
  product_name,
  price,
  CASE WHEN price > 10000 THEN '高額'
    ELSE '低額'
  END AS price_category,
  UPPER(product_name) AS product_name_upper
FROM products;
| name | product_name | price | price_category | product_name_upper |
|---|---|---|---|---|
| 山田太郎 | ノートパソコン | 10000 | 高額 | ノートパソコン |
| 佐藤花子 | スマートフォン | 8000 | 低額 | スマートフォン |
| 田中次郎 | テレビ | 50000 | 高額 | テレビ |



SQL CASE式 以外の方法

IF関数

SELECT IF(sex = 'M', 'Mr.', 'Ms.') AS title
FROM users;

DECODE関数

SELECT DECODE(sex, 'M', 'Mr.', 'F', 'Ms.', 'Mx.') AS title
FROM users;

CASE WHEN 構文

SELECT
  CASE sex
    WHEN 'M' THEN 'Mr.'
    WHEN 'F' THEN 'Ms.'
    ELSE 'Mx.'
  END AS title
FROM users;

COALESCE関数

SELECT COALESCE(NULLIF(sex, 'M'), 'Mr.') AS title
FROM users;

これらの方法は、CASE式と同様、条件に基づいて異なる結果を返すことができます。それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分ける必要があります。

  • 読みやすい
  • 書きやすい
  • 保守しやすい
  • すべてのデータベースでサポートされているわけではない

IF関数のメリット

  • シンプル
  • 読みづらい
  • 書きづらい
  • CASE式よりも簡潔に書ける
  • CASE式よりも読みづらい
  • NULL値を処理できる

どの方法を使うべきかは、状況によって異なります。以下のような点を考慮する必要があります。

  • 条件分岐処理の複雑さ
  • 保守性
  • 使用しているデータベース

複雑な条件分岐処理の場合は、CASE式よりもIF関数やDECODE関数を使う方が良い場合があります。

読みやすさを重視する場合は、CASE WHEN 構文を使う方が良い場合があります。

使用しているデータベースによっては、すべての方法がサポートされているわけではありません。


sql


sp_executesqlを使用して動的にSELECT TOP @varを実行する

sp_executesql は、動的にSQLクエリを実行するためのストアドプロシージャです。この方法を使用するには、まずクエリ文字列を動的に生成する必要があります。次に、sp_executesql を使用して、そのクエリ文字列を実行できます。...


【保存版】OracleでWITH句を複数回使用してSQLクエリを賢く分割する方法

本記事では、OracleにおけるWITH句の複数回使用に関する詳細解説を行います。WITH句は、複雑なSQLクエリをより読みやすく、理解しやすくするための機能です。しかし、複数のWITH句を1つのSQL文で使用できるのかという疑問がよく見られます。...


MySQL WorkbenchでMariaDBインデックスの名前を変更する

MariaDBでは、ALTER TABLE ステートメントを使用して、インデックスの名前を変更することができます。この操作は、インデックスの名前が誤っている場合や、より分かりやすい名前に変更したい場合に役立ちます。手順ALTER TABLE ステートメントを使用して、変更したいインデックスを含むテーブルを選択します。...


【永久保存版】PostgreSQLで曜日を抽出する方法 3選!今週の始まりは月曜日!?

extract() 関数は、日付/時刻値から年、月、日、曜日などの情報を取り出すことができます。曜日を取得するには、dow という引数を使用します。この引数は、0を日曜、1を月曜、6を土曜日として値を返します。このクエリは、your_table テーブルの date_field 列にある日付の曜日をすべて抽出します。結果は次のようになります。...


LEFT JOINとUNION ALLを使いこなせ!MySQLサブクエリGROUP BYで全データを取得

以下では、この要件を満たす2つの主要な方法と、それぞれの注意点について解説します。LEFT JOIN を用いる方法:サブクエリで集計処理を行い、集計結果を抽出する。メインクエリで、サブクエリ結果と元のテーブルを LEFT JOIN で結合する。...