背景描述
前端获取一组id字符串,传到后端的值为aaa,bbb,ccc,ddd
数据库中有一列字段为parent_ids, 值为id的组合,例如0,aaa,ccc,
,0,ccc,
要求获取parent_ids中包含id的数据
方案一
MyBatis-mapper
<select parameterType="string">
SELECT *
FROM table
WHERE
<foreach collection="id.split(',')" item="item" separator=" OR ">
parent_ids LIKE '%'||#{item}||'%'
</foreach>
</select>
最后执行的SQL
SELECT *
FROM table
WHERE
parent_ids LIKE '%'||'aaa'||'%'
OR parent_ids LIKE '%'||'bbb'||'%'
OR parent_ids LIKE '%'||'ccc'||'%'
OR parent_ids LIKE '%'||'ddd'||'%'
查询结果
//一个或多个id都可以查询到结果
方案二 出错的方案
查看网上资料后觉得替换为更简短的语句
Controller
@Autowired
OfficeService service;
@Controller
public String findList(String id){
System.out.println(id); //aaa,bbb,ccc,ddd
id.replaceAll(",", "\\|");
List<Office> officeList = service.findList(id);
}
MyBatis-mapper
<select parameterType="string">
SELECT *
FROM table
WHERE
REGEXP_LIKE(parent_ids,#{id})
</select>
最后执行的SQL(以为的SQL)
SELECT *
FROM table
WHERE REGEXP_LIKE(parent_ids,'aaa|bbb|ccc|ddd')
查询结果
//单个id的时候可以查询结果
//两个id开始查询结果为空,怀疑是字符串传递过程中转义出问题
方案三 | 方法二找不到解决方案
MyBatis-mapper
<select parameterType="string">
SELECT *
FROM table
WHERE
REGEXP_LIKE(parent_ids,REPLACE(#{id}, ',', '|'))
</select>
最后执行的sql
SELECT *
FROM table
WHERE REGEXP_LIKE(parent_ids,'aaa|bbb|ccc|ddd')
查询结果
//不管是几个id都可以查询到结果