SQLのCASE式の使い方を基礎からUPDATE文での応用まで初心者向けに解説

プログラミング 公開日: 更新日:
ブックマーク
SQLのCASE式の使い方を基礎からUPDATE文での応用まで初心者向けに解説
SQLのCASE式は、クエリ内で条件分岐や結果の変更が必要な場合に使用されます。CASE式の基本的な使い方から入れ子にする方法やLIKE演算子を使った応用などを解説します。

SQLのCASE式は、条件に基づいて結果を返す式です。データベース内のテーブルやクエリの結果に基づいて、特定の条件を満たす場合に異なる結果を取得する際に使用されます。

CASE式は通常、SELECT文やUPDATE文などのSQLクエリの中で使用され、クエリの柔軟性を高め、条件に応じた操作や結果の取得を容易にするための強力なツールです。
データの条件に応じて動的な結果を生成するため、データの加工や条件付きの値の置換にも役立ちます。

初めてSQLを学ぶ人にとってもCASE式は非常に便利な機能であり、基本的なデータ操作において頻繁に使用されますので覚えておきましょう。

CASE式の基本的な使い方

SQLのCASE式は、条件に基づいて結果を返すための構文です。データベース内のテーブルやクエリの結果に基づいて、特定の条件を満たす場合に異なる結果を取得する際に使用されます。
CASE式の基本的な使い方は以下の通りです。

単純なCASE式の使用:

CASE 列名
    WHEN 値1 THEN 結果1
    WHEN 値2 THEN 結果2
    ...
    ELSE デフォルト結果
END

この形式では指定した列の値に基づいて条件を評価し、一致する値に対応する結果を返します。デフォルト結果は、条件に一致する値がない場合に返されます。

検索条件を含んだCASE式の使用:

CASE
    WHEN 条件1 THEN 結果1
    WHEN 条件2 THEN 結果2
    ...
    ELSE デフォルト結果
END

この形式では条件式を直接指定して評価します。条件式が真となる場合に対応する結果を返します。デフォルト結果は、いずれの条件も真とならなかった場合に返されます。

CASE式の結果を別名で表示する:

CASE
    WHEN 条件 THEN 結果
END AS 別名

ASを使用して、CASE式の結果を指定した別名で表示します。これにより、クエリの結果セットにわかりやすい列名を表示することができます。

単純CASE式とは

前項でも少し触れましたが、CASE式には単純CASE式と検索CASE式がありますので、もう少し解説していきます。
単純CASE式は特定の列の値に基づいて条件を評価し、それに応じた結果を返す構文です。単純CASE式は一致する値に対応する結果を返すため、値によって異なる処理を行いたい場合に使用されます。

単純CASE式の具体的な例を見てみましょう。以下のクエリは、gender列の値に基づいて性別を表示します。

SELECT name,
    CASE gender
        WHEN 'M' THEN '男性'
        WHEN 'F' THEN '女性'
        ELSE '不明'
    END AS gender_text
FROM users;

この例ではusersテーブルからname列とgender列を取得しています。CASE式を使用して、genderの値に基づいて異なる結果を返しています。'M'の場合は「男性」、'F'の場合は「女性」、それ以外の場合は「不明」という結果がgender_textという別名の列に表示されます。

単純CASE式の特徴は次のとおりです:

  • 条件式には列名を指定します。CASE式はその列の値を評価し、値が一致するかどうかを確認します。
  • 条件と一致する値があれば、対応する結果を返します。
  • 一致する値がない場合は、ELSE節で指定されたデフォルト結果が返されます。
    ELSE節は省略可能ですが、指定しない場合は一致する値がない場合にNULLが返されます。

単純CASE式は、特定の列の値に基づいて結果を分岐させる必要がある場合に便利です。データの条件に応じて異なる処理や表示を行いたい場合に活用できます。

検索CASE式とは

検索CASE式は条件を評価して結果を返す構文であり、条件式を直接指定します。単純CASE式とは異なり、列の値ではなく任意の条件に基づいて結果を取得する場合に使用されます。

検索CASE式の具体的な例を見てみましょう。
以下のクエリは、age列の値に基づいて年齢グループを表示します。

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

この例では、usersテーブルからname列とage列を取得しています。検索CASE式を使用して、ageの値に基づいて異なる結果を返しています。18歳未満の場合は「未成年」、18歳以上65歳未満の場合は「成人」、それ以外の場合は「高齢者」という結果がage_groupという別名の列に表示されます。

検索CASE式の特徴は次のとおりです:

  • 条件式を直接指定します。複数のWHEN節を使用して、条件を評価し一致するかどうかを確認します。
  • 最初に一致する条件に対応する結果が返されます。複数の条件が一致する場合、最初に一致した条件の結果が返され、他の条件は評価されません。
  • ELSE節は省略可能ですが、指定しない場合は一致する条件がない場合にNULLが返されます。

検索CASE式は、任意の条件に基づいて結果を取得する場合に便利です。データの特定の条件に応じて異なる結果を取得したい場合に活用できます。また、他のSQL関数や演算子と組み合わせて使用することもできます。

CASE式を入れ子にする

CASE式の少し応用的な使い方も知っておきましょう。
SQLのCASE式を入れ子にすることで、より複雑な条件分岐や結果の取得が可能になります。入れ子にすると、条件に応じてさらに条件を評価し、それに基づいて結果を取得することができます。

以下に、入れ子のCASE式の基本的な構文と例を示します。

CASE
    WHEN 条件1 THEN
        CASE
            WHEN 条件2 THEN 結果2
            WHEN 条件3 THEN 結果3
            ...
            ELSE デフォルト結果
        END
    WHEN 条件4 THEN
        CASE
            WHEN 条件5 THEN 結果5
            WHEN 条件6 THEN 結果6
            ...
            ELSE デフォルト結果
        END
    ...
    ELSE デフォルト結果
END

上記の構文では、最初のCASE式の結果に基づいて入れ子のCASE式が評価されます。各CASE式は、条件に一致する場合に対応する結果を返します。

以下に具体的な例を示します。次のクエリは、age列の値に応じて異なる年齢グループを表示しますが、さらにgender列の値によって性別別の年齢グループも表示します。

SELECT name,
    CASE
        WHEN gender = 'M' THEN
            CASE
                WHEN age < 18 THEN '未成年男性'
                WHEN age >= 18 AND age < 65 THEN '成人男性'
                ELSE '高齢男性'
            END
        WHEN gender = 'F' THEN
            CASE
                WHEN age < 18 THEN '未成年女性'
                WHEN age >= 18 AND age < 65 THEN '成人女性'
                ELSE '高齢女性'
            END
        ELSE '性別不明'
    END AS age_group
FROM users;

この例では、usersテーブルからname列、gender列、age列を取得します。入れ子のCASE式を使用して、まずgenderの値に基づいて性別を評価し、その結果に応じて年齢グループをさらに評価しています。結果はage_groupという別名の列に表示されます。

入れ子のCASE式を使用することで、より複雑な条件分岐や結果の取得が可能になります。ただし、入れ子が深くなるとクエリが複雑になるため、適切なタイミングで入れ子を使用するようにしましょう。

CASE式の中でLIKE演算子を使用して曖昧判定を行う

SQLのCASE式の中でLIKE演算子を使用することで、文字列の一部のパターンに一致するかどうかを評価することができます。LIKE演算子は、主に文字列の比較やパターンマッチングに使用されます。

以下に、LIKE演算子を使用したCASE式の基本的な構文と例を示します。

CASE
    WHEN 列名 LIKE 'パターン1' THEN 結果1
    WHEN 列名 LIKE 'パターン2' THEN 結果2
    ...
    ELSE デフォルト結果
END

上記の構文では、LIKE演算子を使用して列の値が指定したパターンと一致するかどうかを評価します。一致する場合は対応する結果が返されます。

具体的な例を見てみましょう。次のクエリは、name列の値に応じて特定のパターンに一致するかどうかを評価し、結果を表示します。
名前に山という文字が含まれているか、田という文字で始まるかを調べたいとします。

SELECT name,
    CASE
        WHEN name LIKE '%山%' THEN '山が含まれています'
        WHEN name LIKE '田%' THEN '田で始まります'
        ELSE 'その他の名前です'
    END AS pattern_match
FROM users;

この例では、usersテーブルからname列を取得しています。CASE式を使用して、nameの値が特定のパターンに一致するかどうかを評価しています。'%山%'は名前に「山」が含まれているかを、'田%'は名前が「田」で始まるかを、それぞれ確認しています。一致する場合は対応する結果が、一致しない場合はデフォルト結果がpattern_matchという別名の列に表示されます。

LIKE演算子は、ワイルドカード文字(%や_)を使用してパターンを表現することができます。%は0文字以上の任意の文字列にマッチし、_は任意の1文字にマッチします。

LIKE演算子を使用することで、文字列のパターンマッチングを行い、条件に応じた結果を取得することができます。正確な一致だけでなく、部分一致やパターン検索など、柔軟なデータの評価が可能となります。

UPDATE文でCASE式を使用する

UPDATE文にCASE式を組み合わせることで、特定の条件に基づいてテーブルの値を更新することができます。

以下に、基本的な構文と例を示します。

UPDATE テーブル名
SET 列名 = CASE
    WHEN 条件1 THEN 値1
    WHEN 条件2 THEN 値2
    ...
    ELSE 値N
END
WHERE 条件;

この構文では、テーブル名には更新したいテーブルの名前を指定し、列名には更新したい列の名前を指定します。CASE式では、WHEN節で条件を指定し、その条件が真である場合に値を更新します。ELSE節は、いずれの条件にも当てはまらない場合のデフォルトの値を指定します。WHERE句は、更新を行う対象のレコードを絞り込むための条件を指定します。

具体的な例を見てみましょう。

例1: employeesテーブルのsalary列を条件に応じて更新する

UPDATE employees
SET salary = CASE
    WHEN department = 'Sales' THEN salary * 1.1
    WHEN department = 'IT' THEN salary * 1.2
    ELSE salary
END
WHERE hire_date < '2022-01-01';

上記の例では、employeesテーブルのdepartment列の値に応じてsalary列を更新しています。部署が'Sales'の場合は現在の給与の1.1倍、'IT'の場合は1.2倍に増やし、それ以外の場合は給与を変更しません。さらに、hire_dateが'2022-01-01'より前のレコードのみを更新の対象としています。

例2: productsテーブルのstock列を条件に応じて更新する

UPDATE products
SET stock = CASE
    WHEN price > 1000 THEN stock - 1
    WHEN price < 500 THEN stock + 1
    ELSE stock
END
WHERE category = 'Electronics';

上記の例では、productsテーブルのprice列の値に応じてstock列を更新しています。価格が1000を超える場合は在庫を1減らし、価格が500未満の場合は在庫を1増やし、それ以外の場合は在庫を変更しません。さらに、categoryが'Electronics'であるレコードのみを更新の対象としています。

このように、UPDATE文の中でCASE式を使用することで、条件に基づいた柔軟な値の更新が可能となります。

またWITH句を組み合わせることで、さらに複雑な更新処理を実現することができます。
WITH句については、SQLにおけるWITH句の基本的な使い方とUPDATE文での活用方法 で詳しく紹介しています。

まとめ

SQLにおけるCASE式についてご理解いただけたでしょうか。
CASE式はデータ抽出を行う際に使用する機会がとても多い式です。特定の条件に基づいて表示する内容を変える、数値で格納されているものを文字列にして出力するような場面は多く存在します。
便利さ故につい複雑な条件を記述したり入れ子を多用してしまうことがありますが、可読性は常に意識して活用するようにしましょう。

TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす