MySQLのCASE文の使い方をご紹介!
MySQLのCASE文を使うことで、条件分岐を行うような複雑な処理を行えるようになります。条件分岐とはプログラミング言語でいうところのif文やswitch文にあたります。この記事ではMySQLのCASE文の使い方を実例を用いながら紹介しています。
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)
score
が90
のtaro
はevaluation
がA
、score
が75
のhanako
とscore
が8
0のsachiko
はevaluation
がB
、score
が55
のjiro
はevaluation
がC
となっているのが分かりますね。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
文を使ってこういったこともできるのだとぜひ覚えておいてくださいね。