MySQL Mybatis 动态批量替换 (模拟Oracle regexp_replace功能)

本文介绍如何在MySQL中实现类似Oracle的regexp_replace功能,由于MySQL8.0才引入该函数,作者选择了使用动态生成的replace函数序列来替代特殊字符。通过创建mychar表存储待替换字符,并循环执行replace操作,实现了需求。这种方法虽然简单但有效,对于新增特殊字符只需更新数据库即可。欢迎在评论区分享更优解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中遇到了一个地方,需要把原先用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了。

这种做法只是我个人针对项目的实际需求想到办法,虽然很蠢,但是还是可以有效的解决遇到的问题,不知道能不能帮助到你,如果有更好的方法欢迎在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值