トップへ(mam-mam.net/)

MariaDB(MySQL)でCASE式を使ってSQLで条件分岐

検索:

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,'りんご');
t_item
item_id kind_id item_name
1 1 キャベツ
2 1 レタス
3 1 人参
4 1 大根
5 2 洗剤
6 2 シャンプー
7 3 りんご

CASE文を使用してみる

CASE式は以下のような構文です。

CASE
  WHEN 条件 THENWHEN 条件 THEN 値
  ・・・
  ELSEEND カラムの名前


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 |
+------------+--------+------+
MariaDB(MySQL)のサンプルSQL一覧に戻る