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_abc
のA : 衣服
や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式について解説しました。
ここまでお読みいただきありがとうございました。