今回はSQLの条件分岐で使用するCASE式について説明します。
条件分岐はプログラミング言語においても必須の概念であり、SQLでも使用頻度の高い構文のひとつです。
CASE式は、テーブルのデータを抽出するときや更新する際に条件式を用いて評価(真偽の判定)を行い、その結果に基づいて処理を分岐させることができます。
この記事では、CASE式を使って条件式の評価を行い処理を分岐させる方法を、いくつかの実例を用いて説明します。
何らかのプログラミング言語を扱ったご経験がある方であれば、「条件分岐」についてよくご理解されていると思いますが、基本となる知識のため、この記事では初歩的な内容から説明します。
条件分岐とは、「ある条件を満たしているかどうか」によって、実行する処理を分岐させることをいいます。難しく考える必要はありません。日常的にも使っている思考法です。
今日は雨が降っているか?
明日は出勤か?
その他、Excel関数のIF文も条件分岐のひとつです。
図で表現すると、下記のような「YES」「NO」で処理が分岐するフローチャートです。SQLやプログラミング言語では、YESを「TRUE(真)」、NOを「FALSE(偽)」と表現します。
また、条件式によって処理を分岐させることを『評価』と表現することもあります。
前節で、「条件分岐」の基本的な考え方について説明しましたが、今回の記事で紹介するCASEは一般的に『多分岐』が必要な際に使われます。
これは絶対的なルールではありませんが、IF文の場合には「YES」か「NO」かを判定しますので、複数の条件がある場合には、回答に辿り着くまでに時間がかかる場合があります。
たとえば、上記のIF文とCASE文のイメージでは、CASE文の場合はすぐに『40代』に辿り着けますが、仮にIF文を使った場合には、
と4つの条件の「YES」「NO」を判定したあとにしか『40代』に辿り着けません。
要約すると、単純な二分岐では「IF文」、多分岐では「CASE文」が向いています。
具体的にはSQL文の可読性や実行時の速度に影響します
日常生活の例で考えてみます。例1ではCASE、例2ではIFを使っています。
CASEが向いている例(多分岐)
今日は何曜日か?
IFが向いている例(単純な二分岐)
今日は出勤か?
この章では、テーブルからデータを抽出する際に、格納されている値に対して条件式を用いて評価をするためのCASE式の基本的な書き方を説明します。
SQLのCASE式には、「単純CASE式」と「検索CASE式」の2通りの使い方があります。
検索CASE式と比べ、簡潔なSQLで記述できます
条件式には「等価(=)」しか使えません。つまり、「以上(>=)」や「以下(<=)」などの等価以外の条件が指定できません。
条件式に「以上(>=)」や「以下(<=)」などの「等価(=)」以外の条件も指定できます。なお、検索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式
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式では指定できません。
この章では、テーブルのデータを更新する際に、CASEを使って条件に合致した場合にのみデータを更新するSQL文の書き方を説明します。
UPDATE テーブル名
SET
更新するカラム名 = CASE WHEN 条件1 THEN 処理1
WHEN 条件2 THEN 処理2
ELSE 処理3
END;
※条件1,条件2のそれぞれに条件対象のカラム名が必要です。
前節で紹介したCASEの例に基づき、テーブル「BOOK」に新たなカラムを追加しています。追加したカラム名は「hanbai_umu」です。
UPDATE BOOK SET
hanbai_umu = CASE WHEN syupansha = 'ABC書店' THEN '〇'
WHEN syupansha = 'DEF書店' THEN '△'
ELSE NULL
END;
この章では、テーブルのカラムでNULL判定を行い、NULLであれば値を置き換える(更新する)SQL文の書き方を説明します。
UPDATE テーブル名
SET
更新するカラム名 = CASE
WHEN 条件対象のカラム名 IN NULL THEN 処理
ELSE 条件対象のカラム名
END;
※ELSEは条件に合致しなかった場合、そのままの値を保持する命令です
前節で紹介したCASEの例に基づき、カラム「hanbai_umu」が空白(NULL)の場合には、[×]に更新するSQLの実例です。
UPDATE BOOK SET
hanbai_umu = CASE
WHEN hanbai_umu IS NULL THEN '×'
ELSE hanbai_umu
END;
今回は条件によって処理を分岐させるためのCASE式について、基本的な書き方と実例を記事にしました。
本文でも記載した通り、CASE式はSQLの中でも使用頻度が高い構文のひとつです。記事で紹介したようなデータの抽出時や更新時、またNULL判定においても実務で必須の知識となります。
実際にCASE文を書き実行してみて使い方を習得しましょう。