MySQL の CASE 演算子
ここでは MySQL の CASE 演算子についてご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の CASE 演算子の使い方
MySQL の CASE 演算子は SELECT 文などで使い、条件を上から順番にチェックしていき、最初に合致した条件に指定した結果を返すことができます。
CASE 文の書き方には 2 通りあります。
ひとつめは CASE の直後に比較元の値を指定する構文です。
SELECT CASE value
WHEN compare_value1 THEN result1
WHEN compare_value2 THEN result2
WHEN compare_value3 THEN result3
ELSE result4
END
FROM table
WHEN は複数指定でき、二個目以降の WHEN と ELSE は必須ではありません。
value = compare_value1 の時は result1、 value = compare_value2 の時は result2 を、、、と上から順番に値を比較していき、合致した値の result を返します。
どの値も合致せず、ELSE が指定されている場合は ELSE の結果を返します。
どの値も合致せず、ELSE が指定されていない場合は NULL を返します。
もうひとつの構文は CASE の直後には何も指定せず、 WHEN につづけて条件式を指定する構文です。
SELECT CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN condition3 THEN result3
ELSE result4
END
FROM table
基本的にはひとつめの構文とほぼ同じで、WHEN は複数指定でき、二個目以降の WHEN と ELSE は必須ではありません。
上から順番に条件式 (condition) を評価していき、最初に True となった条件式に指定した result を返します。
どの条件式も True にならず、ELSE が指定されている場合は ELSE の結果を返します。
どの条件式も True にならず、ELSE が指定されていない場合は NULL を返します。
こちらの構文だけ覚えておけば、ひとつめの構文のケースにも使えます。
MySQL の CASE 演算子を使ってレコードを取得する
それでは、実際に CASE 演算子を使ってデータを取得してみましょう。
まずは CASEの直後に値を指定する、ひとつめの CASE 演算子の構文を使います。
次のような students テーブルがあります。
この students テーブルから、CASE を使って gender が M の時は 「 男性 」、F の時は 「 女性 」、それ以外は 「 不明 」 という値を取得するには次のようにできます。
SELECT gender,
CASE gender
WHEN 'M' THEN '男性'
WHEN 'F' THEN '女性'
ELSE '不明'
END AS '性別'
FROM students;
[実行結果]
gender に合った「 性別 」カラムが取得できています。
次は WHEN に続いて条件文を指定する、ふたつめの CASE 演算子の構文を使います。
次のような exam_results テーブルがあります。
この exam_results テーブルから、CASE を使って score によって、A・B・C・D・F のグレード取得するには次のようにできます。
SELECT score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'F'
END AS grade
FROM exam_results;
[実行結果]
score に合った grade が取得できています。
本来 B グレードは 80 <= score <= 89 ですが、条件文を上から順番に評価していって、True になったところで止まるので、条件文には score >= 80 とだけ指定しています。
以上、MySQL の CASE 演算子についてご説明しました。