LoginSignup
42
42

More than 5 years have passed since last update.

便利なCASE文

Last updated at Posted at 2015-08-07

条件分岐の際にとっても便利なので簡単なサンプルを利用してメモ

CASE文の書式

※ 各分岐が返すデータ型を統一し、ELSEを必ず入れる


-- 単純 CASE式
CASE sex
  WHEN '1' THEN '男'
  WHEN '2' THEN '女'
ELSE 'その他' END

-- 検索 CASE式
CASE WHEN sex = '1' THEN '男'
     WHEN sex = '2' THEN '女'
ELSE 'その他' END

例1)下記の体系を新しい体系へ変換

以下のテーブルがあったとして(ノーマルテーブル)

県名 人口
青森 200
秋田 600
山形 500
岩手 300
東京 200
茨城 100
徳島 100
愛媛 400
香川 500
高知 200

集計結果を以下のようにしたい

地域名 人口
東北 1600
四国 1200
その他 300

SELECT CASE 県名
  WHEN '青森' THEN '東北'
  WHEN '岩手' THEN '東北'
  WHEN '秋田' THEN '東北'
  WHEN '山形' THEN '東北'
  WHEN '徳島' THEN '四国'
  WHEN '愛媛' THEN '四国'
  WHEN '香川' THEN '四国'
  WHEN '高知' THEN '四国'
ELSE 'その他' END AS distinct,
SUM(人口)
FROM ノーマルテーブル
GROUP BY CASE 県名
  WHEN '青森' THEN '東北'
  WHEN '岩手' THEN '東北'
  WHEN '秋田' THEN '東北'
  WHEN '山形' THEN '東北'
  WHEN '徳島' THEN '四国'
  WHEN '愛媛' THEN '四国'
  WHEN '香川' THEN '四国'
  WHEN '高知' THEN '四国'
ELSE 'その他' END;

※ SELECT分をコピーするという事が大事!

例2)UPDATE - id(主キー)1と2を入れ替える -

サンプルテーブル

id value1 value2
1 a
2 b
3 c

下記の様にするのもいいが3回実行するのは無駄


-- 1. id(1)の値を4へ
UPDATE サンプルテーブル
  SET id = '4'
  WHERE id = '1';
-- 1. id(2)の値を1へ
UPDATE サンプルテーブル
  SET id = '1'
  WHERE id = '2';
-- 1. id(4)の値を2へ
UPDATE サンプルテーブル
  SET id = '2'
  WHERE id = '4';

CASE式で


UPDATE サンプルテーブル
  SET id = CASE 
           WHEN id = '1' THEN '2'
           WHEN id = '2' THEN '1'
           ELSE id END
  WHERE id IN ('1', '2');

例3)テーブル同士のマッチング

TEAM_MST

ID TEAM_NAME
1 赤坂ライオンズ
2 大門ジャイアンツ
3 田町イーグルス
4 六本木ロッカーズ

SCHEDULES

MONTH TEAM_ID
201507 1
201507 3
201507 4
201508 4
201509 2
201509 4

TEAM_NAME        7月  8月  9月
---------        ---- ---- ----
赤坂ライオンズ     勝  負  負
大門ジャイアンツ   負  負  勝
田町イーグルス     勝  負  負
六本木ロッカーズ   勝  勝  勝

上記のように勝ち負けを表にしたい時


SELECT A.TEAM_NAME,
       CASE
       WHEN EXISTS
         (SELECT TEAM_ID FROM SCHEDULES B
            WHERE MONTH = 201507
              AND B.TEAM_ID = A.TEAM_ID) THEN '勝'
       ELSE '負' END AS '7月',
       WHEN EXISTS
         (SELECT TEAM_ID FROM SCHEDULES B
            WHERE MONTH = 201508
              AND B.TEAM_ID = A.TEAM_ID) THEN '勝'
       ELSE '負' END AS '8月',
       WHEN EXISTS
         (SELECT TEAM_ID FROM SCHEDULES B
            WHERE MONTH = 201509
               AND B.TEAM_ID = A.TEAM_ID) THEN '勝'
       ELSE '負' END AS '9月'
     FROM TEAM_MST A;

INでも実装可能だがINとEXISTSで迷ったらEXSITSのパフォーマンスは良いらしい。
サブクエリで主キーのインデックスを利用できる為

42
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
42