【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
俊樹
マイケル
仁美
花子
太郎
夏美
五郎

参考

https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821