LaravelのクエリビルダでCASE文を使う方法

こんにちは、さるまりんです。

今回は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();

複雑な文でもrawselectRaw、他にも条件に使えるwhereRawhavingRawなど、順序に使えるorderByRawを使って実現できるようです。

便利な仕組み、いろいろ試してみたいと思います。

読んでくださってありがとうございます。

それではまた!