You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel连接SQLSRV时Union查询CASE语句报错,MySQL正常求解决

解决SQL Server下Laravel Union查询中CASE语句的引号问题

问题原因

SQL Server与MySQL对字符串常量的解析规则存在差异:

  • MySQL允许使用双引号包裹字符串常量
  • SQL Server会将双引号包裹的内容识别为列名,因此你的CASE语句中"Program"、"Course"等内容被当成了不存在的列,触发Invalid column name错误。

修复后的代码

将CASE语句中所有双引号替换为单引号即可:

$courses = DB::table('courses')
            ->where('courses.name', 'like', '%'.$search_text.'%')
            ->selectRaw(
                'id, courses.name as name, courses.created_at as created_at,
                (CASE
                    WHEN courses.is_program = 1 THEN \'Program\'
                    WHEN courses.is_program = 0 THEN \'Course\'
                    ELSE \'Unknown\'
                END) AS type'
            );

$surveys = DB::table('surveys')
            ->where('surveys.name', 'like', '%'.$search_text.'%')
            ->selectRaw(
                'id, surveys.name as name, surveys.created_at as created_at,
                 (CASE
                    WHEN surveys.id != 0 THEN \'Survey\'
                    ELSE \'Unknown\'
                END) AS type'
            );

$exhibitions = DB::table('exhibitions')
            ->where('exhibitions.name', 'like', '%'.$search_text.'%')
            ->selectRaw(
                'id, exhibitions.name as name, exhibitions.created_at as created_at,
                 (CASE
                    WHEN exhibitions.id != 0 THEN \'Exhibition\'
                    ELSE \'Unknown\'
                END) AS type'
            );

$results = $courses->unionAll($surveys)->unionAll($exhibitions);
if ($perPage) {
    $results = $results->paginate($perPage);
} else {
    $results = $results->get();
}

额外优化建议

避免直接拼接$search_text到SQL语句中,防止SQL注入风险,改用Laravel查询构建器的自动参数绑定:

// 替换原where条件为更安全的写法
->where('courses.name', 'like', "%{$search_text}%")

内容的提问来源于stack exchange,提问作者Cairo coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:07:05