Laravel 7 如何在查询构造器/原生查询中使用CASE/IF生成衍生status字段
报错核心原因
- 语法规则混淆:你使用的PostgreSQL(从报错格式可判断)规定,字符串字面量必须用单引号包裹,双引号仅用于标识表、列等数据库对象。你代码里写的
"0"、"Yes"、"No"全部被数据库识别为列名,因此抛出column "0" does not exist的错误。 - 多余的类型判断:
is_active本身就是布尔类型,不需要额外和字符串格式的"0"做等值判断,直接基于布尔值本身做判断即可,刚好匹配你要的映射逻辑:is_active为false时status返回Yes,is_active为true时status返回No。
可正常运行的修正代码
$data = DB::table('my_table as app') ->select('fullname', 'is_active', DB::raw("( CASE WHEN app.is_active = false THEN 'Yes' ELSE 'No' END ) AS status") ) ->get();
执行后返回的结果完全匹配预期:
| fullname | is_active | status |
|---|---|---|
| Mr. X | false | Yes |
| Mr. Z | true | No |
补充说明:如果你的数据库是MySQL、且布尔类型底层存储为
tinyint(0代表false,1代表true),只需要把判断条件改成WHEN app.is_active = 0 THEN 'Yes'即可,不需要给数字加引号。
内容的提问来源于stack exchange,提问作者Fenz
相关产品推荐
相关产品推荐

