0Pricing
Coding Interview Prep · レッスン

SELECT内のCASE式

インラインの条件ロジックと、検索CASE形式と単純CASE形式の書き方を学びます。

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

CASE:SQLの条件式

CASEはSQLにおけるif/then/elseですが、1つの値を返す式です。そのため、SELECT、WHERE、ORDER BY、さらには集約関数の中など、値を記述できる場所ならどこでも使用できます。

SELECT order_id,
       amount,
       CASE WHEN amount > 100 THEN 'large' ELSE 'small' END AS size
FROM orders;

検索CASE形式

検索CASEは、各WHENでブール条件を確認し、最初に一致した結果を返します。最も柔軟な形式であり、順序が重要です。最初に真になった条件が採用されます。

SELECT score,
       CASE
         WHEN score >= 90 THEN 'A'
         WHEN score >= 80 THEN 'B'
         WHEN score >= 70 THEN 'C'
         ELSE 'F'
       END AS grade
FROM exam_results;

単純CASE形式

単純CASEは、1つの式を値のリストと比較します。等価比較には短く書けますが、範囲やNULLの検査には使えません。

SELECT status_code,
       CASE status_code
         WHEN 1 THEN 'active'
         WHEN 2 THEN 'paused'
         WHEN 3 THEN 'closed'
         ELSE 'unknown'
       END AS status_label
FROM accounts;

検索CASEと単純CASE:使い分け

固定値との等価比較には単純CASEを使い、範囲やNULLの判定には検索CASEを使います。重要な落とし穴として、単純CASEでNULLに一致させることはできません。検索形式でIS NULLを使ってください。

-- Simple CASE will NOT catch NULL here
SELECT CASE WHEN bonus IS NULL THEN 'no bonus'
            ELSE 'has bonus'
       END AS bonus_flag
FROM employees;

WHENの分岐順序が重要

最初に一致した分岐が採用されるため、WHENは順序を最も具体的な条件から最も一般的な条件へ並べてください。緩いしきい値を先に置くと、スコア95が誤ったラベルになります。

-- Correct order: highest threshold first
SELECT CASE
         WHEN score >= 90 THEN 'A'
         WHEN score >= 80 THEN 'B'
         ELSE 'C or below'
       END AS grade
FROM exam_results;

ELSEと暗黙のNULL

どの条件にも一致せずELSEを省略した場合、CASEはNULLを返します。予期しない値が暗黙的にNULLになるのを防ぐため、デフォルト値を明示的なELSEで指定してください。

-- No ELSE: anything not 1/2 becomes NULL
SELECT CASE flag WHEN 1 THEN 'yes' WHEN 2 THEN 'no' END AS label
FROM toggles;

条件付き集約(ピボットパターン)

面接で特に役立つテクニックが条件付き集約です。SUMやCOUNTの中にCASEを入れると、1回の処理でカテゴリごとの行数を集計できます。すっきりしたピボット形式のレポートになります。

SELECT
  SUM(CASE WHEN status = 'paid'    THEN 1 ELSE 0 END) AS paid_orders,
  SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders,
  SUM(CASE WHEN status = 'paid'    THEN amount ELSE 0 END) AS paid_revenue
FROM orders;

COUNTはNULLを無視する:CASEの短縮方法

COUNTはNULLを無視するため、ELSEを省略できます。一致しない行はNULLになり、カウントされません。条件付きカウントを少し短く記述する方法です。

SELECT
  COUNT(CASE WHEN status = 'paid' THEN 1 END)    AS paid_orders,
  COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_orders
FROM orders;

ORDER BYのCASEで独自の並べ替え

ORDER BYの中にCASEを置くと、通常のアルファベット順や数値順ではなく、独自の優先順位で並べ替えられます。たとえば、緊急、通常、それ以外の順にする場合です。

SELECT order_id, status
FROM orders
ORDER BY
  CASE status
    WHEN 'urgent' THEN 1
    WHEN 'normal' THEN 2
    ELSE 3
  END,
  order_id;

分岐間での型の一貫性

CASEのすべての分岐は互換性のある型を返す必要があります。数値と文字列を混在させるとエラーになったり、キャストが強制されたりするため、出力型を1つにそろえ、必要なら明示的にキャストしてください。

-- Keep branches the same type
SELECT CASE WHEN qty > 0 THEN CAST(qty AS VARCHAR)
            ELSE 'none'
       END AS qty_label
FROM inventory;

WHEREのCASEによる条件付きフィルタリング

WHEREのCASEを使うと、フラグに応じて異なるフィルターロジックを適用できます。たとえば、地域ごとに異なる価格のしきい値を設定する場合です。ANDやORが複雑に絡み合う条件より、すっきり書けることがよくあります。

SELECT order_id, amount, region
FROM orders
WHERE amount > CASE region
                 WHEN 'US'  THEN 100
                 WHEN 'EU'  THEN 90
                 ELSE 50
               END;

確認問題

結果を予測してみましょう。

まとめ

まとめると、CASEは1つの値を返し、SELECT、WHERE、ORDER BY、集約関数で使用できます。検索CASEは範囲やNULLを扱い、最初の一致が採用されます。一致しなければNULLになり、分岐間で型を互換性のあるものに保つ必要があります。

よくある質問

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

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

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

インラインの条件ロジックと、検索CASE形式と単純CASE形式の書き方を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Coding Interview Prepを始めるのに経験は必要ですか?

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

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

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

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

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

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

  1. 列の射影とエイリアスの落とし穴
  2. 計算列と式の優先順位
  3. 一意性におけるDISTINCTとGROUP BYの違い
  4. SELECT内のCASE式
← Coding Interview Prepに戻る