Michi's Tech Blog

一人前のWebエンジニアを目指して

SQL総復習⑥ CASE式

こんにちは!
スマレジ テックファームのMichiです!

今回は『SQL総復習⑥ CASE式」編です。

CASE式とは?

CASE式はSQLで条件分岐を記述するときに使う構文です。一般的なプログラミング言語if文に相当します。

構文

CASE式の構文には単純CASE式検索CASE式の2種類があります。ただし、検索CASE式は単純CASE式の機能をすべて含むので、基本的には検索CASE式さえ覚えておけば問題ありません。

検索CASE式の構文は以下のようになります。

CASE 
    WHEN <評価式> THEN <式>
    WHEN <評価式> THEN <式>
    WHEN <評価式> THEN <式>
        ・
        ・
        ・
    ELSE <式>
END

WHEN句の<評価式>とは、戻り値が真偽値(TRUE/FALSE)になるような式のことです。具体的に言えば、=<>LIKE などの比較演算子を使って作る式になります。

CASE式の動作は、最初のWHEN句の<評価式>が評価されることから始まります。評価された結果がTRUEならば、THEN句で指定された式が戻り値になり、CASE式全体が終了します。もし評価された結果がFALSEならば、次のWHEN句の評価に移ります。この作業を最後まで繰り返してなおTRUEにならなかった場合は、ELSEで指定された式が戻り値となります。

実践

以下のような、商品情報を管理するテーブルitemsが存在するとします。

id name category sales_price purchace_price registered_date
1 Tシャツ 衣服 1000 500 2009-09-20
2 穴あけパンチ 事務用品 500 320 2009-09-11
3 カッターシャツ 衣服 4000 2800 NULL
4 包丁 キッチン用品 3000 2800 2009-09-20
5 圧力鍋 キッチン用品 6800 5000 2009-01-15
6 フォーク キッチン用品 500 NULL 2009-09-20
7 おろしがね キッチン用品 880 790 2008-04-28
8 ボールペン 事務用品 100 NULL 2009-11-11


このテーブルのcategoryカラムには、衣服事務用品キッチン用品という3種類の商品分類が格納されています。これをCASE式を使って次のような表示に変えてみます。

A : 衣服
B : 事務用品
C : キッチン用品


SQL

SELECT
    name,
    CASE
        WHEN category = '衣服' THEN CONCAT('A : ', category)
        WHEN category = '事務用品' THEN CONCAT('B : ', category)
        WHEN category = 'キッチン用品' THEN CONCAT('C : ', category)
        ELSE NULL
    END AS category_with_abc
FROM 
    items;

CONCATは、文字列同士を結合するMySQLの関数


■結果

name category_with_abc
Tシャツ A : 衣服
穴あけパンチ B : 事務用品
カッターシャツ A : 衣服
包丁 C : キッチン用品
圧力鍋 C : キッチン用品
フォーク C : キッチン用品
おろしがね C : キッチン用品
ボールペン B : 事務用品


CASE式自体は、最終的に1つの値として変換されます。この例で言えば、CASE式の6行がcategory_with_abcA : 衣服B : 事務用品といったわずか数文字の結果に変換されているのです。

応用編

応用編として、CASE式の便利な使い方を紹介します。

先ほどのitemsテーブルで、商品分類(category)ごとに販売単価(sales_price)を合計したいとき、通常であればGROUP BY句を使用します。

SQL

SELECT 
    category,
    SUM(sales_price) AS sum_sales_price
FROM
    items
GROUP BY
    category;


■結果

category sum_sales_price
衣服 5000
事務用品 600
キッチン用品 15180


では、この結果を「列」として並べたい場合はどうすればよいでしょうか?こんな時にCASE式が使えます。SUM関数の中でCASE式を使うことによって、実際に列を3つ作ってしまえばいいのです。

SQL

SELECT 
    SUM(
        CASE
            WHEN category = '衣服' THEN sales_price
            ELSE 0
        END
    ) AS sum_garment_price,
    SUM(
        CASE
            WHEN category = 'キッチン用品' THEN sales_price
            ELSE 0
        END
    ) AS sum_kitchen_price,
    SUM(
        CASE
            WHEN category = '事務用品' THEN sales_price
            ELSE 0
        END
    ) AS sum_office_price
FROM
    items;


■結果

sum_garment_price sum_kitchen_price sum_office_price
5000 15180 600


このCASE式でやっていることは、商品分類(category)が特定の値と合致した場合、その商品の販売単価(sales_price)を出力し、そうでない場合は0を出力する、ということです。その結果をSUMを使って合計することで、特定の商品分類の販売単価の合計値を出力できるようになるわけです。

このように、CASE式はテーブルの行列を変換したい場合にも使うことができます。

まとめ

今回はCASE式について解説しました。
ここまでお読みいただきありがとうございました。