注:解决方案适用于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第三行';
这就是我目前对于这个问题研究出来的解决方案,有不对的地方很欢迎有同学提出来,共同学习、共同进步;