CASE文で複雑な条件を指定

CASE文を使うと複雑な条件を指定できます。SELECT句、GRUOP BY句、ORDER BY句でそれぞれ使用した例を紹介します。

基本書式

CASE 評価対象カラム名
    WHEN 条件値1 THEN 処理
    [WHEN 条件値2 THEN 処理] ...
    [ELSE 処理]
END
CASE
    WHEN 条件1 THEN 処理
    [WHEN 条件2 THEN 処理] ...
    [ELSE 処理]
END

動作確認用テーブル

動作確認のための準備をします。

CREATE TABLE `test`.`testtable` (
 `id` INT NOT NULL ,
 `old` INT NOT NULL ,
 `region` VARCHAR(100) NOT NULL ,
  PRIMARY KEY (`id`)
) ENGINE = InnoDB;
INSERT INTO `testtable` (`id`, `old`, `region`)
VALUES
(1, 50, '四国'),
(2, 23, '九州'),
(3, 11, '本州'),
(4, 80, '北海道'),
(5, 33, '本州');

下記テーブルを例に説明します。

mysql> SELECT * FROM `testtable`;
+----+-----+-----------+
| id | old | region    |
+----+-----+-----------+
|  1 |  50 | 四国      |
|  2 |  23 | 九州      |
|  3 |  11 | 本州      |
|  4 |  80 | 北海道    |
|  5 |  33 | 本州      |
+----+-----+-----------+
5 rows in set (0.00 sec)

SELECT句での使用例

データ値によって表示を変えたい場合などに使用します。

mysql> SELECT id, (CASE WHEN (old < 20)               THEN 'A'
    ->                  WHEN (old >= 20 AND old < 50) THEN 'B'
    ->                  ELSE 'C' END) as type 
    -> FROM testtable;
+----+------+
| id | type |
+----+------+
|  1 | C    |
|  2 | B    |
|  3 | A    |
|  4 | C    |
|  5 | B    |
+----+------+
5 rows in set (0.00 sec)

GRUOP BY句での使用例

mysql> SELECT COUNT(id), (CASE WHEN (old < 20)               THEN 'A'
    ->                        WHEN (old >= 20 AND old < 50) THEN 'B'
    ->                        ELSE 'C' END) as type 
    -> FROM testtable
    -> GROUP BY CASE WHEN (old < 20)               THEN 'A'
    ->               WHEN (old >= 20 AND old < 50) THEN 'B'
    ->               ELSE 'C' END;
+-----------+------+
| COUNT(id) | type |
+-----------+------+
|         1 | A    |
|         2 | B    |
|         2 | C    |
+-----------+------+
3 rows in set (0.00 sec)

ORDER BY句での使用例

任意の順序をつけたい場合に使用します。

mysql> SELECT id, region
    -> FROM testtable
    -> ORDER BY CASE region WHEN '北海道' THEN '1'
    ->                      WHEN '本州'   THEN '2'
    ->                      WHEN '四国'   THEN '3'
    ->                      WHEN '九州'   THEN '4'
    ->                      ELSE '' END;
+----+-----------+
| id | region    |
+----+-----------+
|  4 | 北海道    |
|  3 | 本州      |
|  5 | 本州      |
|  1 | 四国      |
|  2 | 九州      |
+----+-----------+
5 rows in set (0.00 sec)