【MYSQL】CASE式の使い方
CASE式とは
SQL内で条件分岐させるために使い、 SELECT, WHERE, GROUP BY, HAVING, ORDER BYなどで使うことができます。
また、どの条件にも満たない時、エラーとなってしまう可能性もありますので ELSEは基本的に記述するようにします。
単純CASEと検索CASE
CASE式は以下の2つの書き方がありますが、 動き方は2つとも同じです。
単純CASEのほうがスッキリした書き方ですが 単純CASEでできることは検索CASEでもできるので、基本的には検索CASEを使うようにします。
単純CASE
CASE score WHEN 0 THEN '女性' WHEN 1 THEN '男性' ELSE 'その他' END
検索CASE
CASE WHEN score = 0 THEN '女性' WHEN score = 1 THEN '男性' ELSE 'その他' END
例1)SELECTで使用した場合
テーブル作成
CREATE TABLE paper_tests( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, score INT NOT NULL, gender INT NOT NULL, class INT NOT NULL );
データ作成
INSERT INTO paper_tests (name, score, gender, class) VALUES ('太郎', 65, 1, 1), ('花子', 90, 0, 1), ('俊樹', 35, 1, 2), ('仁美', 70, 0, 2), ('五郎', 40, 1, 1), ('夏美', 50, 0, 2), ('マイケル', 100, 1, 3) ;
データ
id | name | score | gender | class |
---|---|---|---|---|
1 | 太郎 | 65 | 1 | 1 |
2 | 花子 | 90 | 0 | 1 |
3 | 俊樹 | 35 | 1 | 2 |
4 | 仁美 | 70 | 0 | 2 |
5 | 五郎 | 40 | 1 | 1 |
6 | 夏美 | 50 | 0 | 2 |
7 | マイケル | 100 | 1 | 3 |
検索
-- scoreが90点以上→A -- scoreが60点〜89点→B -- scoreが0点〜59点→C SELECT name AS "名前", score AS "点数", CASE WHEN score >= 90 THEN 'A' WHEN score >= 60 THEN 'B' ELSE 'C' END AS "評価" FROM paper_tests;
結果
名前 | 点数 | 評価 |
---|---|---|
太郎 | 65 | B |
花子 | 90 | A |
俊樹 | 35 | C |
仁美 | 70 | B |
五郎 | 40 | C |
夏美 | 50 | C |
マイケル | 100 | A |
例2)SUM関数で使用した場合
検索
-- クラスごとの男性の合計点数、女性の合計点数、クラス全体の合計点数を出す SELECT class, SUM(CASE WHEN gender = 0 THEN score ELSE 0 END) AS "女性の合計点数", SUM(CASE WHEN gender = 1 THEN score ELSE 0 END) AS "男性の合計点数" FROM paper_tests GROUP BY class;
結果
class | 女性の合計点数 | 男性の合計点数 |
---|---|---|
1 | 90 | 105 |
2 | 120 | 35 |
3 | 0 | 100 |
例3)ORDER BY句で使用した場合
検索
-- 不規則に並び替える SELECT name, FROM paper_tests ORDER BY CASE name WHEN "俊樹" then 1 WHEN "マイケル" then 2 WHEN "仁美" THEN 3 WHEN "花子" THEN 4 WHEN "太郎" THEN 5 WHEN "夏美" THEN 6 WHEN "五郎" THEN 7 ELSE null END ;
結果
name |
---|
俊樹 |
マイケル |
仁美 |
花子 |
太郎 |
夏美 |
五郎 |