検索CASEと単純CASE
CASEを記述する2つの方法を学びます。
「検索CASEと単純CASE」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
CASEの2つの書き方
SQLにはCASE式の2つの形式、Simple CASEとSearched CASEがあります。どちらも条件に基づいて値を返しますが、条件の書き方が異なります。
このレッスンを終えるころには、それぞれの形式を使うべき場面と、取り違えたときに起こりやすいミスの避け方がわかります。
Simple CASE — 考え方
Simple CASEは、1つの式を複数の値と比較します。検索表のようなものだと考えてください。左側に1つの列または値を指定し、各WHEN分岐でその値が何と等しいかを列挙します。
構文:CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END
SELECT
product_name,
category_id,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;Simple CASEの実践
ここでは、CASE式をキーワードの直後に置き、列statusを各WHENの値と等価比較しています。WHEN分岐にstatus =と書かない点に注意してください。比較は暗黙的に行われます。
SELECT
order_id,
status,
CASE status
WHEN 'pending' THEN 'Awaiting payment'
WHEN 'paid' THEN 'Payment received'
WHEN 'shipped' THEN 'On its way'
WHEN 'delivered' THEN 'Completed'
ELSE 'Unknown status'
END AS status_label
FROM orders;Searched CASE — 考え方
Searched CASEでは、CASEキーワードの直後に式を置きません。代わりに、各WHEN分岐に完全なブール条件を記述します。そのため柔軟性が非常に高く、異なる列を組み合わせたり、範囲を確認したり、各WHEN内で関数を呼び出したりできます。
構文:CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END
SELECT
employee_name,
salary,
CASE
WHEN salary < 30000 THEN 'Entry Level'
WHEN salary < 60000 THEN 'Mid Level'
WHEN salary < 100000 THEN 'Senior'
ELSE 'Executive'
END AS salary_band
FROM employees;Searched CASEの実践
各WHENでは任意のブール式を指定できるため、1つの分岐で複数の列を組み合わせられます。データベースはWHEN句を上から下へ評価し、TRUEである最初の分岐の結果を返します。
SELECT
product_name,
stock,
price,
CASE
WHEN stock = 0 THEN 'Out of stock'
WHEN stock < 10 AND price > 100 THEN 'Low stock — premium item'
WHEN stock < 10 THEN 'Low stock'
ELSE 'In stock'
END AS availability
FROM products;構造上の主な違い
次の表は、中心となる違いをまとめたものです。
Simple CASE — CASEの後に1つの式を置き、各WHENでその式との等価比較を行います。
Searched CASE — CASEの後に式を置かず、各WHENが独立したブール条件になります。
Simple CASEは等価比較しか行わないため、範囲、NULL、複数列の条件は扱えません。直接的な値の一致以外には、Searched CASEを使用してください。
-- Simple CASE: equality only
SELECT CASE day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
ELSE 'Other'
END AS day_name
FROM schedule;
-- Searched CASE: any condition
SELECT CASE
WHEN day_number BETWEEN 1 AND 5 THEN 'Weekday'
WHEN day_number IN (6, 7) THEN 'Weekend'
END AS day_type
FROM schedule;NULLの扱い — Searched CASEが有利な理由
Simple CASEは内部で=を使用しますが、SQLではNULL = NULLがTRUEになることはありません。そのため、Simple CASEではNULLを含む列に一致させることができません。Searched CASEならWHEN column IS NULL THEN ...と記述でき、正しく機能します。
-- Simple CASE: NULL branch never matches
SELECT CASE manager_id
WHEN NULL THEN 'No manager' -- this will NEVER fire
ELSE 'Has manager'
END
FROM employees;
-- Searched CASE: correct NULL check
SELECT CASE
WHEN manager_id IS NULL THEN 'No manager'
ELSE 'Has manager'
END AS manager_status
FROM employees;Searched CASEで列を組み合わせる
Searched CASEの大きな強みは、各WHEN分岐でまったく異なる列を参照したり、関数を呼び出したりできることです。これにより、Simple CASEではまったく扱えない複雑な業務ルールも表現できます。
SELECT
customer_name,
total_orders,
total_spent,
CASE
WHEN total_spent > 10000 AND total_orders > 20 THEN 'VIP'
WHEN total_spent > 5000 THEN 'Gold'
WHEN total_orders > 10 THEN 'Silver'
ELSE 'Standard'
END AS tier
FROM customers;ORDER BYでCASEを使用する
どちらの形式のCASEもORDER BYの内部で使用し、データに存在しないカスタムの並べ替え順を作成できます。ここではSimple CASEで優先度の名前を数値に対応付け、アルファベット順ではなく業務上の優先順に行を並べ替えています。
SELECT ticket_id, subject, priority
FROM support_tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
ELSE 5
END ASC;集約関数内のCASE
Searched CASEをSUMやCOUNTの内部に記述するのは、条件付き集約の典型的なパターンです。ピボットと呼ばれることもあります。複数のクエリを実行せず、1回のスキャンで複数カテゴリの合計を生成できます。
SELECT
department,
COUNT(*) AS total_employees,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
SUM(CASE WHEN salary > 70000 THEN salary ELSE 0 END) AS high_earner_payroll
FROM employees
GROUP BY department;適切な形式を選ぶ
実用的な目安は次のとおりです。
1つの列を既知の固定値の集合に対応付ける場合は、Simple CASEを使用してください。記述が短く、読みやすくなります。
それ以外の場合は、Searched CASEを使用してください。範囲、NULLの確認、複数列のロジック、条件内での関数呼び出しなどに対応できます。
迷った場合は、Searched CASEを使えば対応できます。Simple CASEはSearched CASEに書き換えられますが、その逆はできません。
-- These two queries return identical results
-- Simple CASE (concise for equality)
SELECT CASE region_code
WHEN 'US' THEN 'United States'
WHEN 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;
-- Equivalent Searched CASE
SELECT CASE
WHEN region_code = 'US' THEN 'United States'
WHEN region_code = 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;理解度チェック
Simple CASEとSearched CASEについての理解度を確認しましょう。
レッスンの復習
このレッスンで学んだことを振り返りましょう。
Simple CASE — CASEの後に1つの式を置き、各WHENでその式が特定の値と等しいかを確認します。1つの列を固定されたラベルの一覧に対応付ける場合に適しています。
Searched CASE — CASEの後に式を置かず、各WHENに完全なブール条件を記述します。範囲、NULLの確認、複数列のロジック、関数呼び出しに対応できます。
どちらの形式も分岐を上から下へ評価し、最初にTRUEになった分岐の結果を返します。どの分岐にも一致せずELSEもない場合、結果はNULLです。柔軟性を最大限に求めるなら、Searched CASEが常に安全な選択です。Simple CASEでできることをすべて行えるうえ、それ以上のことにも対応できます。
よくある質問
「検索CASEと単純CASE」レッスンは無料ですか?
はい。「検索CASEと単純CASE」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「検索CASEと単純CASE」で何を学びますか?
CASEを記述する2つの方法を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「検索CASEと単純CASE」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CASE式
- 検索CASEと単純CASE
- データの分類とラベル付け
- ORDER BYと集約でCASEを使う