0Pricing
SQL Academy · レッスン

CASE式

クエリ内でIF/THENのロジックを使います。

「CASE式」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

SQLの分岐ロジック

クエリに判断をさせたいことがあります。これならこうし、そうでなければ別の処理をするという場合です。SQLには、そのためのCASE式があります。

CASEを使うと、SELECTの中で条件に応じて異なる値を返せます。SQL版のif/elseチェーンと考えるとよいでしょう。

SELECT name,
       CASE WHEN price > 100 THEN 'expensive'
            ELSE 'affordable'
       END AS price_band
FROM products;

CASEの構造

CASE式にはいくつかの構成要素があります。

  • WHEN condition THEN value — 1つ以上の分岐
  • ELSE value — 省略可能なフォールバック
  • END — 式を閉じます(必須です)。

SQLはWHENの分岐を上から下へ評価し、真になる最初の分岐の値を返します。

CASE WHEN condition1 THEN result1
     WHEN condition2 THEN result2
     ELSE default_result
END

CASEは値を返す

重要なポイントは、CASE式が1行につき1つの値に評価されることです。値を生成するため、値を指定できる場所ならどこでも使用できます。SELECTリスト、WHERE、ORDER BY、さらには関数の内部でも使えます。

ここでは、各注文に簡単なステータスを付けています。

SELECT order_id,
       CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
            WHEN paid_at IS NOT NULL THEN 'paid'
            ELSE 'pending'
       END AS status
FROM orders;

最初に一致した分岐が選ばれる

順序が重要です。SQLは各WHENを順番に確認し、最初に真になった分岐で処理を停止します。後続の分岐にも一致する場合であっても、後続の分岐は無視されます。

次の例では、1000を超える注文は最初に一致した分岐が選ばれるため、'medium'ではなく'large'になります。

SELECT order_id, total,
       CASE WHEN total >= 1000 THEN 'large'
            WHEN total >= 100  THEN 'medium'
            ELSE 'small'
       END AS size_band
FROM orders;

ELSE分岐

ELSE分岐は、それまでの条件に当てはまらない場合の受け皿です。どのWHEN条件も真でない場合、CASEはELSEの値を返します。

ELSEを省略して一致する分岐がない場合、CASEはNULLを返します。これは予期しないNULLの一般的な原因なので、明確なフォールバックが必要な場合は明示的なELSEを追加してください。

SELECT name,
       CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)

条件には任意の式を使える

WHEN条件は単なるブール式です。WHERE句で記述するものと同じ種類の式です。比較、AND、OR、BETWEEN、IN、LIKEなどを使用できます。

SELECT email,
       CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
            WHEN email LIKE '%@test.com'             THEN 'test account'
            ELSE 'review'
       END AS segment
FROM users;

結果の型は互換性が必要

CASEのすべての分岐は、互換性のある型の値を返す必要があります。列の型は1つでなければならないためです。テキストと数値を混在させると、エラーになったり、予期しないキャストが行われたりします。

ある分岐では数値を、別の分岐ではテキストを返す必要がある場合は、明示的にキャストして型をそろえてください。

SELECT product_id,
       CASE WHEN on_sale THEN price * 0.9
            ELSE price
       END AS effective_price   -- all branches numeric: good
FROM products;

WHEREでCASEを使う

CASEは値を生成するため、その結果をWHERE句の中で比較できます。動的なフィルタリングルールに便利です。

ただし、多くの場合、WHEREで通常のブール論理を使ったほうが明確です。WHEREでCASEを使うのは、分岐によって条件が本当にわかりやすくなる場合に限るとよいでしょう。

SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
           ELSE total > 500
      END;

CASEのネスト

別のCASE分岐の中にCASEを置くことで、段階的なロジックを表現できます。これは動作しますが、式を深くネストすると読みにくくなります。

ネストは浅く保ち、複雑になった場合は、別の列や参照テーブルを使うほうが通常はすっきりします。

SELECT order_id,
       CASE WHEN region = 'EU' THEN
              CASE WHEN total > 100 THEN 'EU big'
                   ELSE 'EU small' END
            ELSE 'other'
       END AS bucket
FROM orders;

集約関数とCASE

強力なパターンとして、CASEをSUMやCOUNTなどの集約関数の中に入れる方法があります。これにより、1回の処理で条件付きの件数集計や合計を実行できます。これは条件付き集約またはピボットと呼ばれることもあります。

SELECT
  COUNT(*) AS total_orders,
  SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
  SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;

意図的にNULLを返すCASE

分岐からNULLを返すことが、まさに適切な場合もあります。たとえば、表示したくない値を空欄にしたり、NULLを無視する後続の集約に渡したりする場合です。

ここでは、大きな注文だけが合計を保持し、それ以外はNULLになります。そのため、AVGでそれらをスキップできます。

SELECT order_id,
       CASE WHEN total >= 1000 THEN total
            ELSE NULL
       END AS large_order_total
FROM orders;

理解度チェック

total = 1500 の行について、次の式を考えてみてください。

CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END

どの値が返されますか?

復習:CASE式

SQLにおける条件分岐ロジックの基本を学びました。

  • CASE WHEN ... THEN ... ELSE ... ENDは各行に対して1つの値を返します
  • 分岐は上から下へ確認され、最初に一致したものが優先されます
  • ELSEを省略すると、一致するものがない場合はNULLになります
  • すべての分岐は互換性のある型を返す必要があります
  • CASEはSELECT、WHERE、集約関数の内部で使用できます

次は、CASEの2つの構文形式を比較します。

SELECT name,
       CASE WHEN price > 100 THEN 'expensive'
            WHEN price > 20  THEN 'mid'
            ELSE 'cheap'
       END AS tier
FROM products;

よくある質問

「CASE式」レッスンは無料ですか?

はい。「CASE式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「CASE式」で何を学びますか?

クエリ内でIF/THENのロジックを使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「CASE式」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CASE式
  2. 検索CASEと単純CASE
  3. データの分類とラベル付け
  4. ORDER BYと集約でCASEを使う
← SQL Academyに戻る