SQL│CASEの構文。SELECT・UPDATE・NULL判定

今回はSQLの条件分岐で使用するCASE式について説明します。

条件分岐はプログラミング言語においても必須の概念であり、SQLでも使用頻度の高い構文のひとつです。

CASE式は、テーブルのデータを抽出するときや更新する際に条件式を用いて評価(真偽の判定)を行い、その結果に基づいて処理を分岐させることができます。

この記事では、CASE式を使って条件式の評価を行い処理を分岐させる方法を、いくつかの実例を用いて説明します。

目次

はじめに~条件分岐とは

何らかのプログラミング言語を扱ったご経験がある方であれば、「条件分岐」についてよくご理解されていると思いますが、基本となる知識のため、この記事では初歩的な内容から説明します。

評価(条件分岐)とは?

条件分岐とは、「ある条件を満たしているかどうか」によって、実行する処理を分岐させることをいいます。難しく考える必要はありません。日常的にも使っている思考法です。

条件分岐の例

今日は雨が降っているか?

  • YES・・傘を持っていく
  • NO・・傘は持たない

明日は出勤か?

  • YES・・目覚ましをセットする
  • NO・・目覚ましはセットしない

その他、Excel関数のIF文も条件分岐のひとつです。

図で表現すると、下記のような「YES」「NO」で処理が分岐するフローチャートです。SQLやプログラミング言語では、YESを「TRUE(真)」、NOを「FALSE(偽)」と表現します。

また、条件式によって処理を分岐させることを『評価』と表現することもあります。

分岐のフローチャート

CASEとIFについて

前節で、「条件分岐」の基本的な考え方について説明しましたが、今回の記事で紹介する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文の可読性や実行時の速度に影響します

補足_CASEとIFの使い分け

日常生活の例で考えてみます。例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書店の場合、[注文可]の文言を出力
参考:テーブル_BOOK
単純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の実例

MySQLのCASE式

PostgreSQLの実例

PostgreSQLのCASE式

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に更新
参考:テーブル_BOOK
UPDATE BOOK SET
hanbai_umu = CASE WHEN syupansha = 'ABC書店' THEN '〇'
          WHEN syupansha = 'DEF書店' THEN '△'
ELSE NULL
END;

MySQLの実例(CASE・UPDATE)

MySQLのCASE(UPDATE)式

PostgreSQLの実例(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ではない場合、元の値を保持
参考:テーブル_BOOK
UPDATE BOOK SET
hanbai_umu = CASE
WHEN hanbai_umu IS NULL THEN '×'
ELSE hanbai_umu
END;

MySQLの実例(CASE・NULL判定)

MySQLのCASE(UPDATE)式

PostgreSQLの実例(CASE・NULL判定)

PostgreSQLのCASE(NULL判定)式

あとがき

今回は条件によって処理を分岐させるためのCASE式について、基本的な書き方と実例を記事にしました。

本文でも記載した通り、CASE式はSQLの中でも使用頻度が高い構文のひとつです。記事で紹介したようなデータの抽出時や更新時、またNULL判定においても実務で必須の知識となります。

実際にCASE文を書き実行してみて使い方を習得しましょう。

目次