like多个值
客户反映某个字段不支持模糊查询了,经查看,是因为此次新需求该字段要支持多条件查询,并以空格分割,最大不超30个。 同事修改把like 给换成了in。
举例:
原来写法
where 1=1 AND ( A like '%?%')
需求之后的sql:
where 1=1 AND ( A IN (?) OR B IN (?) OR C IN (?) OR D IN (?))
但是客户并没有要求把模糊给去掉,所以修改sql
方案一:(因为ABCD 4个字段是一组的,所以当5个值的时候就会是54=20个条件,最多30个,也就意味着是304=120个条件。
where 1=1 AND ( A like '%?%' OR B like '%?%' OR C like '%?%' OR D like '%?%' OR A like '%?%' OR B like '%?%' OR C like '%?%' OR D like '%?%' OR A like '%?%' OR B like '%?%' OR C like '%?%' OR D like '%?%' A like '%?%' OR B like '%?%' OR C like '%?%' OR D like '%?%')
方案二: 将多个条件换成简单的格式,使用正则表达式(即使有30个值,最多后面跟30个值就可以了,而不用多写那么多条件)
如果是3个值,就是1|2|C
如果是5个值,就是3|4|a|8|c|0
…依次用“|”分割
where 1=1 AND( A REGEXP '1|2|C' OR B REGEXP '1|2|C' OR C REGEXP '1|2|C' OR D REGEXP '1|2|C')
处理逻辑代码
String [] nameArr = {"A","B","C","D"};
String [] arr = serv.getxxx().replaceAll("\\+"," ").split(" ");
ArrayList<String> list = new ArrayList<String>();
StringBuilder sb=new StringBuilder();
for(int i=0;i<arr.length;i++){
if(!"".equals(arr[i]) && isNotBlank(arr[i])){
sb.append(arr[i]+"|"); //修改之前同事写的list,一直跳不出来,后来这么改之后是合理的,是我想要的一个串“123|a|c|d,123|a|c|d” 之后再带进去。
}
}
targetSql.append(" AND (");
for (int i=0;i<nameArr.length;i++){
if(i == 0){
targetSql.append(" " + nameArr[i] + " REGEXP ?");
}else{
targetSql.append(" OR " + nameArr[i] + " REGEXP ?");
}
targetParams.add(sb.substring(0,sb.length()-1)); //去除最后一个|符合
}
targetSql.append(") ");