关键字模糊查询银行名实现快速检索
数据库:pg数据库 持久层框架:Ibatis
最近,在项目开发的过程中遇到了一个有关关键字搜索银行名的需求,模糊查询相信小伙伴们都很熟悉啦,就是对于查询条件做筛选来包含查询条件的连续关键字的所有符合条件的名词。最开始只是对于所输入的关键字做了模糊查询,后来随着用户的使用,业务提出了新的需求,银行名关键字搜索支持一个或两个关键字,如果是两个关键字则中间加空格来输入。不支持多于两个关键字查询。
举个例子:
一.一个关键字:中国银行
所有以下的sql都是以中国银行来举例,银行名称表apsrtgsnode,关键字段描述:lname:银行名,bankcode:银行编码
1.正常最简单最常用的模糊查询sql:
select lname,bankcode from apsrtgsnode where lname like '%中国银行%'
此条sql语句查询出了所有带有中国银行四个字眼的连续的银行名称,
可能为:中国银行,中国银行北京支行等
2.进而提出需求,如果一个关键字要查询出所有带中国银行四个字眼的银行名称,于是便有了以下思路:
在每个查询的字眼前后都加上%,使得查询结果为带中国银行四个字的所有结果集,sql展示:
select lname,bankcode from apsrtgsnode where lname like '%中%国%银%行%'
而此条sql语句则查出了所有带中国银行四个字眼的连续的非连续的所有包含的银行名
可能为:中国银行,中国建设银行,中国工商银行,中国银行北京支行等
二.两个关键字:中国银行+空格+分行,即:中国银行 分行
先说一下为什么要用两个关键字查询,主要原因是客户使用习惯,一般客户会先输入一个银行关键字,在输入一个地方来查找当地的所有输入的银行,
举个例子:中国银行小汤山支行(可能会不存在)
于是就有了新的需求,输入一个关键字的时候,需要按照输入内容靠前展示的方式来展示出内容,例如:输入中国银行,那么展示时首先展示肯定为中国银行,而不是中国银行北京支行或者是中国建设银行;输入两个关键字的时候需要按照第一个关键字优先,第二关键字随后的展示方式来展示。于是就有了以下两种实现方式,直接上SQL
方法一:
1 (select lname,bankcode from apsrtgsnode where lname like '%中国银行%' and lname like '%分行%' order by bankcode) 2 union all 3 (select lname,bankcode from apsrtgsnode where lname like '%中%国%银%行%' and lname like '%分%行%' and (lname not like '%中国银行%' or lname not like '%分行%') order by bankcode)
方法二:
select lname,bankcode from apsrtgsnode where 1=1 and lname like '%中%国%银%行%' and lname like '%分%行%' order by (case when lname like '%中国银行分行%' then 1 when lname like '%中国银行%' then 2 when lname like '%分行%' then 3 else 4 end),bankcode
以上两种方法都实现相关需求,但是查询速率会有不同,当查询关键字条件越多推荐使用第一种,查询关键字少或者是一个推荐使用第二种。在这做个记录,有小伙伴有更好的解决方法请留言,遨游在代码海洋里的小虾米。。。。。。