Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのcase文についてまとめています。

SQL caseの構文

CASEで始まり、ENDで終わるブロック内に、条件式と返り値を記述します。以下の例では、employes(社員)テーブルの、hire_date(雇用日)を1992年以前かどうか判定し「after 1992」か「before 1992」を出力するSQLです。

mysql>SELECT first_name, 
       last_name, 
       CASE 
         WHEN hire_date < '1992-01-01' THEN 'before 1992' 
         ELSE 'after 1992' 
       end AS check_hire 
FROM   employees 
LIMIT  10; 

+------------+-----------+-------------+
| first_name | last_name | check_hire  |
+------------+-----------+-------------+
| Georgi     | Facello   | before 1992 |
| Bezalel    | Simmel    | before 1992 |
| Parto      | Bamford   | before 1992 |
| Chirstian  | Koblick   | before 1992 |
| Kyoichi    | Maliniak  | before 1992 |
| Anneke     | Preusig   | before 1992 |
| Tzvetan    | Zielinski | before 1992 |
| Saniya     | Kalloufi  | after 1992  |
| Sumant     | Peac      | before 1992 |
| Duangkaew  | Piveteau  | before 1992 |
+------------+-----------+-------------+
10 rows in set (0.01 sec)

SQL caseの使い方

特定のカラムの値をcase式で入れ替えアップデートする

case式は、select文だけではありません。insert、update、deleteにも使えます。

以下の例は、employees(社員)テーブルに対して、genderの値をMならFに、FならMに入れ替え、それ以外ならそのままにしておくというSQLです。

mysql> select * from employees;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
 :
 :
UPDATE 
	employees 
SET 
	gender = 
    case 
        when gender='M' then 'F'
        when gender='F' then 'M'
        else gender
    end
WHERE 
	gender in ('M','F');

【関連記事】
SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ

単純case式と検索case式 検索case式ではより複雑な条件が指定可能

case式には単純case式と検索case式という記述方法があります。(単純case式をcase式、検索case式をcase文と呼ぶ場合もあり)

違いは、単純case式では等価判定のみなのに比べて、case式では不等号や範囲判定、inなどの内包判定などが使える点。

# 通常のcase式
SELECT cust_last_name,
   CASE credit_limit WHEN 100 THEN 'Low'
   WHEN 5000 THEN 'High'
   ELSE 'Medium' END AS credit
   FROM customers
   ORDER BY cust_last_name, credit;

CUST_LAST_NAME       CREDIT
-------------------- ------
Adjani               Medium
Adjani               Medium
Alexander            Medium
Alexander            Medium
Altman               High
Altman               Medium
. . .

# 検索case式
SELECT AVG(CASE WHEN e.salary > 2000 THEN e.salary
   ELSE 2000 END) "Average Salary" FROM employees e;

Average Salary
--------------
    6461.68224

参考)Oracle公式ドキュメント:CASE式

検索case式があれば、単純case式が不要に思えます。しかし、値の判定の方法が異なるため、whenが多数並ぶような長いcase式だと単純case式が高速なケースがあるんですね。

ただ、可読性も考慮するとcase式の記述は検索case式の形式で記述するのが良いでしょう。

まとめ

ポテパンダの一言メモ
  • SQLのcase式は、SQL内に分岐処理を組み込むことが可能
  • case式はselect文だけではなく、insert、update、deleteに使える
  • case式には単純case式と検索case式という2種類の記述方法がある

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。