MyBatis中模糊查询使用CONCAT('%',#{str},'%')出错

本文揭示了在SQLserver中使用加号而非CONCAT函数进行字符串连接的解决方案,解决了因SQLserver不支持CONCAT函数而引发的问题。

经过我一套乱七八糟毫无思路地查找后,发现不是Mybatis的原因,原来是SQL server不支持CONCAT函数,直接用加号连接就好

WITH RECURSIVE date_series AS ( SELECT id, team_id, date_name, start_time AS work_date, company_name, work_status FROM ics_declared_work WHERE work_status IN ( 'IN_PROGRESS', 'END' ) AND ( start_time LIKE concat( '%', '2025-10', '%' ) OR end_time LIKE concat( '%', '2025-10', '%' ) ) UNION ALL SELECT w.id, w.team_id, w.date_name, DATE_ADD( d.work_date, INTERVAL 1 DAY ), d.company_name, d.work_status FROM date_series d JOIN ics_declared_work w ON d.id = w.id WHERE w.end_time >= DATE_ADD( d.work_date, INTERVAL 1 DAY ) AND w.work_status IN ( 'IN_PROGRESS', 'END' ) AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) ) ), unit_list AS ( SELECT unit_short_name AS unit_name FROM ics_construction_unit_info WHERE current_status = 1 AND unit_type = '施工单位' ORDER BY sort -- 施工单位 ) SELECT '2025-10' AS `month`, ul.unit_name AS unitName, ( SELECT count(*) FROM ( SELECT CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time ) END AS time, m.team_id FROM ics_declared_work w LEFT JOIN ics_after_class_meeting m ON w.team_id = m.team_id WHERE w.work_status IN ( 'IN_PROGRESS', 'END' ) AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) ) AND m.unit_name = ul.unit_name AND time LIKE concat( '%', '2025-10', '%' ) AND date( time ) BETWEEN date( w.start_time ) AND date( w.end_time ) GROUP BY CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time ) END, m.team_id ) a WHERE a.time LIKE concat( '%', '2025-10', '%' ) ) AS number, ( SELECT count(*) FROM ( SELECT CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date ) END AS time, team_id FROM date_series WHERE work_date LIKE concat( '%', '2025-10', '%' ) AND company_name = ul.unit_name AND work_status IN ( 'IN_PROGRESS', 'END' ) GROUP BY CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date ) END, team_id ORDER BY work_date ) c ) AS necessaryNumber, COALESCE ( ROUND(( SELECT count(*) FROM ( SELECT CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time ) END AS time, m.team_id FROM ics_declared_work w LEFT JOIN ics_after_class_meeting m ON w.team_id = m.team_id WHERE w.work_status IN ( 'IN_PROGRESS', 'END' ) AND ( w.start_time LIKE concat( '%', '2025-10', '%' ) OR w.end_time LIKE concat( '%', '2025-10', '%' ) ) AND m.unit_name = ul.unit_name AND time LIKE concat( '%', '2025-10', '%' ) AND date( time ) BETWEEN date( w.start_time ) AND date( w.end_time ) GROUP BY CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( time ), INTERVAL 1 DAY ) ELSE date( time ) END, m.team_id ) b )/( SELECT count(*) FROM ( SELECT CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date ) END AS time, team_id FROM date_series WHERE work_date LIKE concat( '%', '2025-10', '%' ) AND company_name = ul.unit_name AND work_status IN ( 'IN_PROGRESS', 'END' ) GROUP BY CASE WHEN date_name IN ( '凌晨,晚上', '晚上,凌晨' ) THEN DATE_SUB( date( work_date ), INTERVAL 1 DAY ) ELSE date( work_date ) END, team_id ORDER BY work_date ) c )* 100, 2 ), 0 ) AS rate FROM unit_list ul;帮我优化入参将2025-10替换为#{month}
11-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值