今回はMySQLのCASE構文について整理して書き留めておきたいと思います。
まず、MySQLのCASE構文は主に次の2つの構文に分類できます。
1.値のリストとの比較
CASE case_value
WHEN when_value
THEN statement_list
[WHEN when_value
THEN statement_list
] ...
[ELSE statement_list
]
END CASE
『MySQL 5.6 リファレンスマニュアル :: 13.6.5.1 CASE 構文』
2.条件分岐
CASE
WHEN search_condition
THEN statement_list
[WHEN search_condition
THEN statement_list
] ...
[ELSE statement_list
]
END CASE
『MySQL 5.6 リファレンスマニュアル :: 13.6.5.1 CASE 構文』
実際に試してみたいと思いますが、その前に、準備を行います。
$ mysql -u root
mysql> create database students;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+------------------------+
| Database |
+------------------------+
| students |
+------------------------+
mysql> Ctrl-C -- exit!
Aborted
$ mysql -u root -D students
mysql> show tables;
Empty set (0.00 sec)
mysql> create table test(name text, age integer);
mysql> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| test |
+--------------------+
1 row in set (0.00 sec)
mysql> insert into test (name, age) values ('taro', 14), ('jiro', 16), ('sabro', 18);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+-------+------+
| name | age |
+-------+------+
| taro | 14 |
| jiro | 16 |
| sabro | 18 |
+-------+------+
3 rows in set (0.00 sec)
準備ができましたので、それぞれ試してみたいと思います。
なお、下記の例では、CASE構文で取得したデータのカラムにタイトル名を設定するためにas句を使用していますが、この際には「end case」の「case」は取り外す必要があります。
1.値のリストとの比較
mysql> select
-> name,
-> case age
-> when 13 then '中学1年生'
-> when 14 then '中学2年生'
-> when 15 then '中学3年生'
-> when 16 then '高校1年生'
-> when 17 then '高校2年生'
-> when 18 then '高校3年生'
-> else 'その他'
-> end as class
-> from test;
+-------+---------------+
| name | class |
+-------+---------------+
| taro | 中学2年生 |
| jiro | 高校1年生 |
| sabro | 高校3年生 |
+-------+---------------+
3 rows in set (0.00 sec)
2.条件分岐
mysql> select
-> name,
-> case
-> when age between 13 and 15 then '中学生'
-> when age between 16 and 18 then '高校生'
-> else 'その他'
-> end as junior_senior
-> from test;
+-------+---------------+
| name | junior_senior |
+-------+---------------+
| taro | 中学生 |
| jiro | 高校生 |
| sabro | 高校生 |
+-------+---------------+
3 rows in set (0.00 sec)
以上です!
【参考サイト】
『MySQL 5.6 リファレンスマニュアル :: 13.6.5.1 CASE 構文』
『MySQL 5.6 リファレンスマニュアル :: 12.4 制御フロー関数』
『カラムの値に応じて異なる結果を返す条件式の記述』