【SQL入門】CASE文の使い方

記述方法

CASE文には2つの書き方が存在します。

単純CASE文

CASE sex
    WHEN 1 THEN '男'
    WHEN 0 THEN '女'
    ELSE 'その他'
END 性別

検索CASE文

CASE 
    WHEN sex = 1 THEN '男'
    WHEN sex = 0 THEN '女'
    ELSE 'その他'
END 性別

単純CASE文のほうが、シンプルに記載することができますが、
複雑な条件を利用したい場合は、検索CASE文を使うことが多いでしょう。

そのため、実際には検索CASE文を用いる場面のほうが多いと思います。

処理の例

CASE文は以下のようにSELECTの部分に記載されます。

SELECT
    CASE 
        WHEN sex = 1 THEN '男'
        WHEN sex = 0 THEN '女'
        ELSE 'その他'
    END 性別
FROM
    sample_table

処理前のテーブル

sex
1
0
1

処理後のテーブル

sex 性別
1
0
1

条件(WHENの中)の処理順序

SELECT
    CASE
        WHEN col IN ('a', 'b', 'c') THEN 1 --①
        WHEN col IN ('a') THEN 2       --②
        ELSE 0
    END value
FROM
    sample_table

CASE文の中で記載されたWHENの部分は、上から順番に処理がされます。
そのため、例文で①が処理されたあとに②が処理されるのです。

しかし、①は②の要素も含んだ条件式になっています。
このような場合、①で条件が合致すると②は処理されず、次のレコードの処理に入ります。

そのため、WHENの記載する順序には、注意をしておく必要があります。

ポイント
WHENは上から順に処理される

CASE文との組み合わせ

実際にCASE文を記載する際には、WHENの中は複雑な条件式になる事が多いです。
先ほどの例のように、WHEN sex = 1などの単純な計算になることは少ないです。

WHENの中によく記載するパターンをご紹介させていただきます。

CASE文とIN

先程の例文でもサラッと出てきましたが、

CASE
    WHEN col IN ('a', 'b', 'c') THEN 1
    ELSE 0
END value

CASE文とLIKE

CASE
    WHEN name LIKE '田中%' 1
    ELSE 0
END value

正規表現を用いることで、文字列検索して部分一致したものを抽出しております。
この場合は、name列に”田中”と始まるレコードに1をつけております。

CASE文と計算

CASE
    WHEN (age + 2) = 10 THEN 1
    ELSE 0
END value

対象となる値に対して2を足して、比較をしております。
今回は足し算を行いましたが、四則演算の様々なパターンが入ることがあります。

CASE文とMAX(MIN)

例えば、以下のようなテーブルがあったとします。

項目 出金額
食費 4000
家賃 50000
光熱費 3000

このテーブルに対して、出金額が最も大きい項目にフラグを立てる。
という処理を行いたい場合は、このようなクエリを作成することも可能です。

CASE
    WHEN (SELECT MAX(出金額) FROM sample) = 出金額 THEN 1
    ELSE 0
END 最高額フラグ
項目 出金額 最高額フラグ
食費 4000 0
家賃 50000 0
光熱費 3000 1

このように、非常に複雑な条件もWHENの中に記載することが可能です。

最後に

CASE文は非常に強力な武器です。
処理を実行する際に、CASE文を用いると処理の幅が大きく広がります。
ぜひ、CASE文を使いこなしましょう!

追記

CASE文の応用的使い方に関しても記事を書きました。

gotto50105010.hatenablog.com

参考文献

入門者の方に非常におすすめの本になります。
わかりやすい解説から、練習問題までたくさん用意されているので、
SQLの習得に有用ではないかと思います。

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)

スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)