こんにちは、さるまりんです。
今回はPHPのフレームワーク、LaravelのクエリビルダでCASEを使ったSELECTを実行します。
こんなテーブルがあります。
students
name |
blood_type_code |
| 大翔 | 1 |
| 詩 | 2 |
| 翔太 | 3 |
| 蒼 | 1 |
| 凛 | 1 |
| 陽葵 | 3 |
| 紬 | 4 |
| 結菜 | 0 |
テーブル名はstudents、カラムnameには名前が、blood_type_codeには血液型コードが入っています。
血液型コードは1がA型、2がB型、3が0型、4がAB型です。
このテーブルから血液型をコードではなく「A型」「B型」のような文字列に変換して取得します。
血液型コードが1〜4以外の時は「不明」とします。
これを実現するためにCASEを使った次のようなSELECT文を書きました。
SELECT CASE blood_type_code
WHEN 1 THEN 'A型'
WHEN 2 THEN 'B型'
WHEN 3 THEN 'O型'
WHEN 4 THEN 'AB型'
ELSE '不明'
END AS blood_type_label
FROM students;
取得されるデータはこうなります。
blood_type_label |
| A型 |
| B型 |
| O型 |
| A型 |
| A型 |
| O型 |
| AB型 |
| 不明 |
このSQLをLaravelのクエリビルダで実現するにはselectRaw()メソッドを使います。
$result = DB::table('students')
->selectRaw("CASE blood_type_code
WHEN 1 THEN 'A型'
WHEN 2 THEN 'B型'
WHEN 3 THEN 'O型'
WHEN 4 THEN 'AB型'
ELSE '不明'
END AS blood_type_label")
->get();
DB::raw()メソッドを使っても同様なことができます。
$result = DB::table('students')
->select(DB::raw("CASE blood_type_code
WHEN 1 THEN 'A型'
WHEN 2 THEN 'B型'
WHEN 3 THEN 'O型'
WHEN 4 THEN 'AB型'
ELSE '不明'
END AS blood_type_label"))
->get();
複雑な文でもrawやselectRaw、他にも条件に使えるwhereRawやhavingRawなど、順序に使えるorderByRawを使って実現できるようです。
便利な仕組み、いろいろ試してみたいと思います。
読んでくださってありがとうございます。
それではまた!