Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
38
Help us understand the problem. What is going on with this article?
@wcareer

便利なCASE文

More than 5 years have passed since last update.

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

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のパフォーマンスは良いらしい。
サブクエリで主キーのインデックスを利用できる為

38
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
wcareer
技術的メモに使っています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
38
Help us understand the problem. What is going on with this article?