在项目中遇到了一个地方,需要把原先用Oracle写的sql改成MySQL的,然而里面就设计到了标题提到的regexp_replace函数。
我们的需求就是,要替换掉数据库中数据中的一些特殊字符,来和后台处理过特殊字符的数据进行比对,判断是否相同。
举个例子,数据库里面有一个字段的值是AB.C-D&V,后台通过处理,得到一个字符串为ABCDV,这个时候我们比较的结果肯定是不等的,所以我们要对数据库的值也进行一个处理。
MySQL直到8.0才出了regexp_replace函数,稳妥起见我们还是不要先用这么新的版本,所以只能通过别的方式来解决。
我的想法很简单,既然没有这个函数,我们就一直用replace替换,动态的生成你需要替换掉的字符,循环的用replace函数替换掉它们。
首先我们新建一张表,取名为mychar。在这表里我们主要存储我们需要替换掉的特殊字符。
字段 | 描述 |
---|---|
id | 主键(意思一下) |
old_char | 需要替换掉的字符 |
new_char | 替换成的字符 |
// 接下来我们就新建一个参数类,用来传入查询的参数
public class InChar {
private List<MyChar> chars;
private String customerName;
// get和set方法省略...
}
// 对应新建的mychar表的实体类
public class MyChar {
private int id;
private String oldChar;
private String newChar;
// get和set方法省略...
}
mychar表的查询方法就省略了…
<!-- 查询主表的sql -->
<select id="selectCustomerName" parameterType="InCustomer" resultMap="mapModel">
SELECT B.* FROM <include refid="sqlTableName" /> B
WHERE B.delete_flag = 0 AND B.customer_class = 2 AND B.check_state_flag IN ('N1', 'Y') AND
<foreach collection="chars" >
REPLACE(
</foreach>
UPPER(B.customer_name)
<foreach collection="chars" index="index" item="item">
, #{item.oldChar}, #{item.newChar})
</foreach> LIKE CONCAT('%', #{customerName}, '%')
</select>
这样,基本上就可以满足替换掉特殊字符的需求了,开始是准备一个个replace手动加的,写死的,后来写着写着发现这太蠢了,而且也不好维护,所以改成了这个样子,虽然还是很蠢,但是还算是比较好维护了,后期如果有新的特殊字符出现,也只需要改下数据库的数据就OK了。
这种做法只是我个人针对项目的实际需求想到办法,虽然很蠢,但是还是可以有效的解决遇到的问题,不知道能不能帮助到你,如果有更好的方法欢迎在评论区留言。