今回はSQLの条件分岐で使用するCASE式について説明します。
条件分岐はプログラミング言語においても必須の概念であり、SQLでも使用頻度の高い構文のひとつです。
CASE式は、テーブルのデータを抽出するときや更新する際に条件式を用いて評価(真偽の判定)を行い、その結果に基づいて処理を分岐させることができます。
この記事では、CASE式を使って条件式の評価を行い処理を分岐させる方法を、いくつかの実例を用いて説明します。
はじめに~条件分岐とは
何らかのプログラミング言語を扱ったご経験がある方であれば、「条件分岐」についてよくご理解されていると思いますが、基本となる知識のため、この記事では初歩的な内容から説明します。
評価(条件分岐)とは?
条件分岐とは、「ある条件を満たしているかどうか」によって、実行する処理を分岐させることをいいます。難しく考える必要はありません。日常的にも使っている思考法です。
今日は雨が降っているか?
- YES・・傘を持っていく
- NO・・傘は持たない
明日は出勤か?
- YES・・目覚ましをセットする
- NO・・目覚ましはセットしない
その他、Excel関数のIF文も条件分岐のひとつです。
図で表現すると、下記のような「YES」「NO」で処理が分岐するフローチャートです。SQLやプログラミング言語では、YESを「TRUE(真)」、NOを「FALSE(偽)」と表現します。
また、条件式によって処理を分岐させることを『評価』と表現することもあります。
CASEとIFについて
前節で、「条件分岐」の基本的な考え方について説明しましたが、今回の記事で紹介するCASEは一般的に『多分岐』が必要な際に使われます。
これは絶対的なルールではありませんが、IF文の場合には「YES」か「NO」かを判定しますので、複数の条件がある場合には、回答に辿り着くまでに時間がかかる場合があります。
たとえば、上記のIF文とCASE文のイメージでは、CASE文の場合はすぐに『40代』に辿り着けますが、仮にIF文を使った場合には、
- 10代か? ⇒NO
- 20代か? ⇒NO
- 30代か? ⇒NO
- 40代か? ⇒YES
と4つの条件の「YES」「NO」を判定したあとにしか『40代』に辿り着けません。
要約すると、単純な二分岐では「IF文」、多分岐では「CASE文」が向いています。
具体的にはSQL文の可読性や実行時の速度に影響します
日常生活の例で考えてみます。例1ではCASE、例2ではIFを使っています。
CASEが向いている例(多分岐)
今日は何曜日か?
- 日曜日・・自由に過ごす
- 月曜日・・出勤後、週報提出
- 火曜日・・出勤後、デスク回り清掃
- 水曜日・・在宅ワーク
- 木曜日・・出勤後、通常ワーク
- 金曜日・・出勤後、顧客データ更新
- 土曜日・・自由に過ごす
IFが向いている例(単純な二分岐)
今日は出勤か?
- YES・・6:00に起床する
- NO・・ゆっくり起床する
条件判定をするCASE
この章では、テーブルからデータを抽出する際に、格納されている値に対して条件式を用いて評価をするためのCASE式の基本的な書き方を説明します。
単純CASE式と検索CASE式
SQLのCASE式には、「単純CASE式」と「検索CASE式」の2通りの使い方があります。
単純CASE式
メリット
検索CASE式と比べ、簡潔なSQLで記述できます
デメリット
条件式には「等価(=)」しか使えません。つまり、「以上(>=)」や「以下(<=)」などの等価以外の条件が指定できません。
検索CASE式
メリット
条件式に「以上(>=)」や「以下(<=)」などの「等価(=)」以外の条件も指定できます。なお、検索CASE式は単純CASE式のすべての機能を含みます。
デメリット
デメリットという程ではありませんが、単純CASE式と比べSQL文が長くなります。
前述の通り、単純CASE式は限定的な使い方しかできません。検索CASE式は単純CASE式のすべての機能を含むため、基本的には検索CASE式のみを使う方向でよいでしょう。
当記事でも単純CASE式の基本構文は紹介しますが、実例については検索CASE式で説明します。
基本構文
単純CASE式
SELECT 抽出するカラム名,
CASE 条件対象のカラム名
WHEN 条件1 THEN 処理1
WHEN 条件2 THEN 処理2
ELSE 処理3
END
FROM テーブル名;
※条件1,条件2にはカラム名は不要です
検索CASE式
SELECT 抽出するカラム名,
CASE WHEN 条件1 THEN 処理1
WHEN 条件2 THEN 処理2
ELSE 処理3
END
FROM テーブル名;
※条件1,条件2のそれぞれに条件対象のカラム名が必要です。
CASE文の実例
- テーブル名・・・BOOK
- 条件対象のカラム名・・・syupansha
- 条件1・・syupanshaがABC書店の場合、[取り扱いあり]の文言を出力
- 条件2・・syupanshaがDEF書店の場合、[注文可]の文言を出力
単純CASE式
SELECT shoseki_mei,
CASE syupansha
WHEN 'ABC書店' THEN '取り扱いあり'
WHEN 'DEF書店' THEN '注文可'
ELSE NULL
END AS 当店の取り扱い状況
FROM BOOK;
検索CASE式
SELECT shoseki_mei,
CASE
WHEN syupansha = 'ABC書店' THEN '取り扱いあり'
WHEN syupansha = 'DEF書店' THEN '注文可'
ELSE NULL
END AS 当店の取り扱い状況
FROM BOOK;
この実例におけるSQL文は、「syupansha」がABC書店、またはDEF書店の場合にそれぞれ指定の文言を出力する処理を行います。単純CASE式の場合には予めCASEの後に条件対象のカラム名である「syupansha」が記述されていますので、それぞれのWHEN毎にカラム名を指定する必要はありません。
一方、検索CASE式ではそれぞれのWHEN毎に条件対象のカラム名(syupansha)を記述する必要があります。
2つのCASE式は全く同じ結果を返しますので、一見、単純CASE式のほうが使いやすく思えますが、「等価(=)」の条件しか指定できない点には注意が必要です。
たとえば、「書籍の値段(hanbai_tanka)が2,500円以上なら~」といった条件は、単純CASE式では指定できません。
MySQLの実例
PostgreSQLの実例
UPDATEでCASEを使う
この章では、テーブルのデータを更新する際に、CASEを使って条件に合致した場合にのみデータを更新するSQL文の書き方を説明します。
基本構文
UPDATE テーブル名
SET
更新するカラム名 = CASE WHEN 条件1 THEN 処理1
WHEN 条件2 THEN 処理2
ELSE 処理3
END;
※条件1,条件2のそれぞれに条件対象のカラム名が必要です。
UPDATEの実例(CASE)
前節で紹介したCASEの例に基づき、テーブル「BOOK」に新たなカラムを追加しています。追加したカラム名は「hanbai_umu」です。
- テーブル名・・・BOOK
- 条件対象のカラム名・・・syupansha
- 条件1・・syupanshaがABC書店の場合、hanbai_umuを[○]に更新
- 条件2・・syupanshaがDEF書店の場合、hanbai_umuを[△]に更新
- 条件3・・条件1,2に該当しない場合、hanbai_umuをNULLに更新
UPDATE BOOK SET
hanbai_umu = CASE WHEN syupansha = 'ABC書店' THEN '〇'
WHEN syupansha = 'DEF書店' THEN '△'
ELSE NULL
END;
MySQLの実例(CASE・UPDATE)
PostgreSQLの実例(CASE・UPDATE)
NULL判定をするCASE文
この章では、テーブルのカラムでNULL判定を行い、NULLであれば値を置き換える(更新する)SQL文の書き方を説明します。
基本構文
UPDATE テーブル名
SET
更新するカラム名 = CASE
WHEN 条件対象のカラム名 IN NULL THEN 処理
ELSE 条件対象のカラム名
END;
※ELSEは条件に合致しなかった場合、そのままの値を保持する命令です
NULL判定の実例(CASE)
前節で紹介したCASEの例に基づき、カラム「hanbai_umu」が空白(NULL)の場合には、[×]に更新するSQLの実例です。
- テーブル名・・・BOOK
- 条件対象のカラム名・・・hanbai_umu
- NULL判定・・・hanbai_umuがNULLの場合、値を[×]に更新
- ELSE・・・hanbai_umuがNULLではない場合、元の値を保持
UPDATE BOOK SET
hanbai_umu = CASE
WHEN hanbai_umu IS NULL THEN '×'
ELSE hanbai_umu
END;
MySQLの実例(CASE・NULL判定)
PostgreSQLの実例(CASE・NULL判定)
あとがき
今回は条件によって処理を分岐させるためのCASE式について、基本的な書き方と実例を記事にしました。
本文でも記載した通り、CASE式はSQLの中でも使用頻度が高い構文のひとつです。記事で紹介したようなデータの抽出時や更新時、またNULL判定においても実務で必須の知識となります。
実際にCASE文を書き実行してみて使い方を習得しましょう。