mybatis无法匹配到含有换行符的字符串的解决方案

注:解决方案适用于postresql,若大家有更好的解决方案,希望可以分享给我


近期碰到一个问题,具体需求是:从Excel导入数据,然后查询出对应系统中已经存在ID;

但这批数据是有换行的字符串,当没有做任何处理,直接作为一个字符串那去查询时,最后的SQL会是这样的

SELECT
    ID
FROM
    table1
WHERE
    txt = '第一行
第二行
第三行';

数据库中保存的需要被匹配的字符串也是这样一个形式的

第一行

第二行

第三行

转义前其实是这种形式

第一行\r\n第二行\r\n第三行

 但在postresql查询时却不会匹配SQL中的换行,导致最后无法正常匹配到;

面对这个问题,我想到了两个解决方案,这里提供给大家:

一、使用chr(10)和chr(13)代替换行符

既然postresql没有匹配换行,所以我们这直接自己使用换行符去匹配;

首先在代码中,把字符串根据换行符(java中是\n) 拆分成多个字符串;

以集合的形式构造mybatis的SQL语句,在每个拆分的字符串后面都加上postresql的chr(13)和chr(10) 

chr(13) => \r   chr(10) => \n

注:最后一个拆分的字符串后面是不需要加chr(13)和chr(10) 的;

SELECT
    ID
FROM
    table1
WHERE
    txt = '第一行' || chr(13) || chr(10) || '第二行' || chr(13) || chr(10) || '第三行';

二、使用postresql的E转义匹配

 这是我最后选择的解决方案,对现有的字符串进行改造一下,然后再使用postresql的E进行转义匹配;

首先在代码中,把字符串的中的换行符(java中是\n)都替换成普通的字符;(str.replaceAll("\n","\\\\r\\\\n"))

在mybatis构造SQL时,原本的txt = #{str} 改成使用postresql的E转义查询  txt = E'${str}'

使用E时,E一定要在字符引号的前面,中间也不可以有空格E''

注:若要匹配的字符串中含有转义字符,则不适合使用这个方案,因为所有的转义字符都会被E转义掉;

SELECT
    ID
FROM
    table1
WHERE
    txt = E'第一行\r\n第二行\r\n第三行';

这就是我目前对于这个问题研究出来的解决方案,有不对的地方很欢迎有同学提出来,共同学习、共同进步;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值