MySQLのCASE文の使い方をご紹介!

MySQLのCASE文を使うことで、条件分岐を行うような複雑な処理を行えるようになります。条件分岐とはプログラミング言語でいうところのif文やswitch文にあたります。この記事ではMySQLのCASE文の使い方を実例を用いながら紹介しています。

コンテンツ [表示]

  1. 1MySQLのCASE文とは?
  2. 2MySQLのCASE文の使い方
  3. 2.1CASE構文
  4. 2.2SELECT句でCASE文を使う
  5. 2.3CASE文でワイルドカードを使う
  6. 3まとめ

MySQLのCASE文とは?

MySQLのCASE文とはプログラミング言語でいうところのif文やswitch文のようなもので、この条件の時はこの処理を行い、あの条件の時はあの処理を行うなどの条件分岐を行うことが出来ます。

CASE文を使いこなせるようになると、複雑な処理もMySQLで行えるようになります。

この記事ではCASE文の基本的な使い方から実際に例を用いて応用的な使い方まで紹介していきます。

MySQLのCASE文の使い方

CASE構文

まずは基本的なCASE構文を紹介します。

CASE文(パターン1)

CASE
  WHEN 条件1 THEN 処理1
  WHEN 条件2 THEN 処理2
  ELSE その他の処理
END

CASE文(パターン2)

CASE 対象カラム
  WHEN 条件値1 THEN 処理1
  WHEN 条件値2 THEN 処理2
  ELSE その他の処理
END

CASE文のパターン1はif文、パターン2はswitch文のような使い方が出来るんですね。

whenの後に条件を記述して、その条件に一致した項目に対してthenの後に記述した処理を実行します。複数条件分岐を行いたい場合にはその数だけwhen 条件 then 処理を記述していきます。

どの条件にも当てはまらなかった場合はelseの後に記述した処理を実行します。elseは省略することも可能ですが、エラーを起こす可能性を避けるためにも記述しておいた方が良いでしょう。

SELECT句でCASE文を使う

それでは実際にCASE文を使っていきましょう。まず、SELECT句を使う中でCASE文を使ってみます。

下記のようなテーブルとデータを用意しました。

mysql> desc users;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
| email | varchar(30) | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
| score | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> select * from users;
+----+---------+---------------------+------+-------+
| id | name    | email               | age  | score |
+----+---------+---------------------+------+-------+
|  1 | taro    | taro@example.com    |   24 |    90 |
|  2 | hanako  | hanako@example.com  |   20 |    75 |
|  3 | jiro    | jiro@example.com    |   18 |    55 |
|  4 | sachiko | sachiko@example.com |   32 |    80 |
+----+---------+---------------------+------+-------+
4 rows in set (0.01 sec)

このusersテーブルのscoreカラムの値に応じて評価(evaluation)を追加して表示していきたいと思います。

85以上で評価A、85点未満60点以上で評価B、60点未満は評価Cとします。

この場合、CASE文は下記のようになります。

CASE
  WHEN score >= 85 THEN 'A'
  WHEN score < 85 AND score >= 60 THEN 'B'
  WHEN score < 60 THEN 'C'
  ELSE 'ERROR'
END AS evaluation

このCASE文をSELECT句の中で使ってみましょう。

mysql> SELECT * ,
    -> CASE
    -> WHEN score >= 85 THEN 'A'
    -> WHEN score < 85 AND score >= 60 THEN 'B'
    -> WHEN score < 60 THEN 'C'
    -> ELSE 'ERROR'
    -> END AS evaluation
    -> FROM users;
+----+---------+---------------------+------+-------+------------+
| id | name    | email               | age  | score | evaluation |
+----+---------+---------------------+------+-------+------------+
|  1 | taro    | taro@example.com    |   24 |    90 | A          |
|  2 | hanako  | hanako@example.com  |   20 |    75 | B          |
|  3 | jiro    | jiro@example.com    |   18 |    55 | C          |
|  4 | sachiko | sachiko@example.com |   32 |    80 | B          |
+----+---------+---------------------+------+-------+------------+
4 rows in set (0.00 sec)

score90taroevaluationAscore75hanakoscore80のsachikoevaluationBscore55jiroevaluationCとなっているのが分かりますね。CASE文を用いて正確に評価できていることが分かります。

CASE文でワイルドカードを使う

CASE文の中でワイルドカードを使うこともできます。

LIKE句とワイルドカードをCASE文の条件式の部分で用います。具体的な使い方を見ていきましょう。

mysql> SELECT * FROM users;
+----+---------+---------------------+------+-------+
| id | name    | email               | age  | score |
+----+---------+---------------------+------+-------+
|  1 | taro    | taro@example.com    |   24 |    90 |
|  2 | hanako  | hanako@example.com  |   20 |    75 |
|  3 | jiro    | jiro@example.com    |   18 |    55 |
|  4 | sachiko | sachiko@example.com |   32 |    80 |
+----+---------+---------------------+------+-------+
4 rows in set (0.01 sec)

mysql> UPDATE users
    -> SET name = CASE
    -> WHEN name LIKE '%ro' THEN 'XXX'
    -> WHEN name LIKE '%ko' THEN 'YYY'
    -> ELSE '???'
    -> END;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> SELECT * FROM users;
+----+------+---------------------+------+-------+
| id | name | email               | age  | score |
+----+------+---------------------+------+-------+
|  1 | XXX  | taro@example.com    |   24 |    90 |
|  2 | YYY  | hanako@example.com  |   20 |    75 |
|  3 | XXX  | jiro@example.com    |   18 |    55 |
|  4 | YYY  | sachiko@example.com |   32 |    80 |
+----+------+---------------------+------+-------+
4 rows in set (0.00 sec)

nameカラムの文字列の値がそれぞれ、末尾roの場合はXXXという文字列に更新し、末尾koの場合はYYYという文字列を更新を行うクエリ文をCASE文を用いて作り、それを実行した結果です。

LIKE句とワイルドカードを用いて曖昧検索を行い、条件に一致したものに対して処理を行います。

まとめ

MySQLのCASE文の使い方を紹介してきました。冒頭でも述べたように、CASE文を使いこなせるようになるとより複雑な処理を行えるようになります。DBやSQLの知識はWEBアプリ開発を行う上でとても大事な要素の1つと言えるので、CASE文を使ってこういったこともできるのだとぜひ覚えておいてくださいね。

GeekHive採用サイト

関連記事