模糊查询时解决'%'和'_'通配符滥用问题

本文介绍如何在SQL查询中实现模糊匹配,并解决通配符导致的数据全匹配问题。通过示例展示了两种常见写法及mybatis配置,并提供了解决方案。

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

经常会有模糊查询的需求,写个模糊查询其实很简单,但是其中可能会遇到一些极少见的问题。例如通配符问题。

模糊查询如下:

//查询param相似的参数,例如1param和param3都会匹配到

//第一种写法:
select s.iid,s.word from sensitive_word s where s.word 
LIKE CONCAT(CONCAT('%','param'),'%') 

//第二种写法
select s.iid,s.word from sensitive_word s 
where s.word LIKE CONCAT('%','param','%');

//mybatis中的xml配置写法
 <select id="selectPageByWord" parameterType="string"      
resultMap="sensitiveWordResultResult">
    select s.iid,s.word from sensitive_word s where 
    <if test="param3 != '' and param3 != null">
       s.word LIKE CONCAT(CONCAT('%',#{param3}),'%') and 
    </if>
    s.is_deleted = 0 ORDER BY s.update_time DESC
</select>

通配符的问题,例如输入的参数是’%’或‘_’,则会匹配到所有的数据,则当然不是我们需要的结果,所以,可用转义字符的方式对这俩字段进行处理。

sql语句中可进行如下处理:在’%’前加‘\’即可,即如下:

select s.iid,s.word,s.create_time from sensitive_word s 
where s.word LIKE CONCAT(CONCAT('%','\%'),'%') ;

对于mybatis中的使用,在xml配置里加上这个比较麻烦,则可在业务代码里对入参进行处理,比较方便,加如下代码即可:

if(sensitiveWord.contains("%") || sensitiveWord.contains("_")){
        sensitiveWord=sensitiveWord.replace("%", "\\%");
        sensitiveWord=sensitiveWord.replace("_", "\\_");
        }

相当于人为给字符前加上转义字符。也就避免了通配符的滥用尴尬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值