【MySQL】CASE文による条件分岐

#DB
written by みよしや

こんにちは、みよしやです。

条件によって取得・更新するカラムが変わる処理を作る際、
SQLを複数用意して、プログラム側で実行するSQLを分けることもできますが、
1つのSQLを実行して済むとプログラムが複雑にならず手間も最小限に抑えられます。

そんな時に活躍するのが、SQLのCASE文です。

CASE文の記述方法

CASE文の記述方法は2種類あります。

[記述方法1]

CASE 評価対象カラム
   WHEN 条件値 THEN 処理
  [WHEN 条件値 THEN 処理] ...
  [ELSE どの条件にも当てはまらない場合の処理]
END

こちらはプログラムのswitch文のような書き方です。
(必須ではない行には括弧が付いています)
評価対象カラムの値と、WHENの条件値が一致した場合に、THENの処理を実行します。

[記述方法2]

CASE
   WHEN 条件 THEN 処理
  [WHEN 条件 THEN 処理] ...
  [ELSE どの条件にも当てはまらない場合の処理]
END

記述方法1と違い、評価対象カラムは設定せずWHENに直接条件を書きます。
if文のような使い方ができるため、条件が少ない場合はこちらが便利です。

どちらの書き方であっても、
WHENの条件に一致せずELSE句も書かれていない場合は、NULLが設定されます。

 

具体的な使用例

id name high_score
1 鈴木 100
2 佐藤 50
3 田中 0

たとえば上のようなテーブルがあったとします。
high_scoreには生徒それぞれの試験の最高点が保存されています。

SELECT 
    name,
    CASE high_score
        WHEN 100 THEN '最優秀'
        WHEN 0 THEN '最下位'
        ELSE 'その他'
    END AS rank
FROM 
    tbl_test
ORDER BY id;

まずは、記述方法1を使用して点数の判定を行うSELECT文を書いてみます。

name rank
鈴木 最優秀
佐藤 その他
田中 最下位

クエリ実行結果です。
high_scoreを評価し、一致する条件に応じて返す値が変わっています。

UPDATE
    tbl_test
SET
    high_score = 
        CASE WHEN high_score IS NULL OR high_score < 70 THEN 70
             ELSE high_score
        END
WHERE
    id = 2;

次は、記述方法2を使用して最高点を更新するUPDATE文です。
上記のクエリを実行すると、佐藤さんのhigh_scoreが50から70に更新されます。

これだけ見ると恩恵を感じないと思いますが、
実際使用する場合は、点数やIDの値をクエリパラメータとして可変にします。
問答無用で更新するクエリなら必要ないですが、
今回のように最高点を上回った時のみ更新したいという場面では活躍します。

最後に

業務でSQLを書く機会が多いため、今後も便利な構文を発見したら記事にしたいと思います。