MariaDB(MySQL)でCASE式(CASE WHEN THEN ELSE END)の使用方法を具体的SQLで解説
CASE式を使用すると条件分岐してSQL処理させることができます。
条件分岐させることが出来ると分類分けや集計などに利用することが出来ます。
プログラムでのif文のようなものだと思ってください。
テスト用データベースとテーブルの作成
説明のためにテスト用データベースとテーブル構造の作成です。
-- データベース作成 CREATE DATABASE IF NOT EXISTS db_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE db_test; -- テーブル作成 CREATE TABLE t_item(item_id INT, kind_id INT, item_name VARCHAR(100)); -- テーブルにレコードを挿入 INSERT INTO t_item values(1,1,'キャベツ'),(2,1,'レタス'),(3,1,'人参'),(4,1,'大根'),(5,2,'洗剤'),(6,2,'シャンプー'),(7,3,'りんご');
item_id | kind_id | item_name |
---|---|---|
1 | 1 | キャベツ |
2 | 1 | レタス |
3 | 1 | 人参 |
4 | 1 | 大根 |
5 | 2 | 洗剤 |
6 | 2 | シャンプー |
7 | 3 | りんご |
CASE文を使用してみる
CASE式は以下のような構文です。
CASE WHEN 条件 THEN 値 WHEN 条件 THEN 値 ・・・ ELSE 値 END カラムの名前
kind_idカラムにCASE式を使ってみます。
kind_idの数字を条件に応じて文字に変更してみます。
SELECT item_id, CASE WHEN kind_id=1 THEN '野菜' WHEN kind_id=2 THEN '日用品' ELSE 'その他' END kind, item_name FROM t_item;
+---------+-----------+-----------------+ | item_id | kind | item_name | +---------+-----------+-----------------+ | 1 | 野菜 | キャベツ | | 2 | 野菜 | レタス | | 3 | 野菜 | 人参 | | 4 | 野菜 | 大根 | | 5 | 日用品 | 洗剤 | | 6 | 日用品 | シャンプー | | 7 | その他 | りんご | +---------+-----------+-----------------+
kind_idカラムにCASE式を使う別の例です。
SELECT item_id, CASE WHEN kind_id IN(1,3) THEN '野菜か果物' ELSE 'その他' END kind, item_name FROM t_item;
+---------+-----------------+-----------------+ | item_id | kind | item_name | +---------+-----------------+-----------------+ | 1 | 野菜か果物 | キャベツ | | 2 | 野菜か果物 | レタス | | 3 | 野菜か果物 | 人参 | | 4 | 野菜か果物 | 大根 | | 5 | その他 | 洗剤 | | 6 | その他 | シャンプー | | 7 | 野菜か果物 | りんご | +---------+-----------------+-----------------+
CASE式とSUM集計関数を使って集計した例です。
SELECT SUM(vegetables) vegetables, SUM(fruits) fruits, SUM(etc) etc FROM ( SELECT CASE WHEN kind_id=1 THEN 1 ELSE 0 END vegetables, CASE WHEN kind_id NOT IN(1,3) THEN 1 ELSE 0 END etc, CASE WHEN kind_id=3 THEN 1 ELSE 0 END fruits FROM t_item ) tb;
+------------+--------+------+ | vegetables | fruits | etc | +------------+--------+------+ | 4 | 1 | 2 | +------------+--------+------+