こんにちは、さるまりんです。
今回は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
を使って実現できるようです。
便利な仕組み、いろいろ試してみたいと思います。
読んでくださってありがとうございます。
それではまた!