$where = null; //$where = new Where(); if($business_no != '1') { // $where['cia.business_no'] = $business_no; $where = "cia.business_no='".$business_no."'"; }else if($keyword){ $where = ["cia.business_no|pi.customer_name","like","%".$keyword."%"]; } $res = Db::name('ceb_inquiry_apply')->alias("cia") ->leftJoin('pg_inquiry pi','pi.business_no = cia.business_no') //->leftJoin('pg_inquiry_detail pid','pid.inquiry_id= pi.id') ->field('cia.*,if(cia.update_time,cia.update_time,cia.create_time) as time') ->field('pi.bank_name,pi.branch_bank_name,pi.customer_name,cia.business_no as business_no') ->order("time","desc") ->where($where) //->group('pid.inquiry_id') ->paginate($paginate); return $res;报错:查询表达式错误:'cia.business_no|pi.customer_name',如何解决
时间: 2024-03-09 19:50:22 浏览: 65
根据错误信息,查询表达式错误是因为 `$where` 的值应该是一个数组,但是你在第一个条件中给 `$where` 赋值了一个字符串。解决这个问题的方法是将第一个条件中的字符串改为数组形式,如下所示:
```
$where = null;
if ($business_no != '1') {
$where['cia.business_no'] = $business_no;
} else if ($keyword) {
$where['cia.business_no|pi.customer_name'] = ['like', "%".$keyword."%"];
}
```
然后在查询语句中使用 `$where` 变量即可。
相关问题
$where = null; if ($business_no != '1') { $where['cia.business_no'] = $business_no; } else if ($keyword) { $where['cia.business_no|pi.customer_name'] = ['like', "%".$keyword."%"]; },当keyword=王的时候,找不到数据,但确认数据表是有一个customer_name叫王婷
如果你确定数据表中存在 `customer_name` 为王婷的记录,但是查询出来却没有,那么可能是因为 like 查询的模糊匹配符 `%` 位置不正确导致的。
你可以尝试将 `%` 符号的位置改为下面这样:
```
$where['cia.business_no|pi.customer_name'] = ['like', "%".$keyword."%"];
```
这样就可以保证在查询 cia.business_no 和 pi.customer_name 字段时都能够匹配到含有王的记录了。另外,你也可以打印一下 `$where` 变量的值,检查生成的查询语句是否符合你的预期。
优化这段代码 SELECT -- 任务id tk.TASK_ID, -- 业务批次号 std.BUSINESS_NO, -- 客户编号 sc.CUSTOMER_NO , -- 聚合商名称 sc.CUSTOMER_NAME , -- 省份 tk.SOURCE_CHANNEL , -- 响应类型 tk.RESPONSE_TYPE , -- 是否模拟 tk.IS_TEST , -- 响应容量 std.TARGET , -- 实际响应容量 std.REAL_TRAGET , -- 响应完成率 ROUND(std.REAL_TRAGET/std.TARGET*100,1) as RESPONSE_COMPLETION_RATE , -- 任务状态 tk.TASK_STATUS, -- 任务拆解ID std.DISASSEMBLE_ID FROM sr_task tk JOIN sr_task_disassemble std ON tk.TASK_ID = std.TASK_ID JOIN sr_customer sc ON std.CUSTOMER_ID = sc.CUSTOMER_ID where 1=1 <if test="taskListVo.province !=null and taskListVo.province !=''"> and tk.SOURCE_CHANNEL = #{taskListVo.province} </if> <if test="taskListVo.responseType !=null and taskListVo.responseType !=''"> and tk.RESPONSE_TYPE = #{taskListVo.responseType} </if> <if test="taskListVo.taskType !=null and taskListVo.taskType !=''"> and tk.SOURCE_CHANNEL like #{taskListVo.taskType} </if> <if test="taskListVo.taskStatus !=null and taskListVo.taskStatus !=''"> and tk.TASK_STATUS like #{taskListVo.taskStatus} </if>
优化建议如下:
1. 尽量避免使用SELECT *,而是应该明确指定需要的列。
2. 避免在WHERE子句中使用1=1这种无意义的条件。
3. 尽量使用表的缩写来简化代码。
4. 使用LEFT JOIN或者INNER JOIN取代JOIN,LEFT JOIN或者INNER JOIN的性能比直接使用JOIN更高效。
5. 如果需要查询的列是数值类型,可以使用 ISNULL 或 COALESCE 函数来避免NULL值。
阅读全文