數據庫: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
以上兩種方法都實現相關需求,但是查詢速率會有不同,當查詢關鍵字條件越多推薦使用第一種,查詢關鍵字少或者是一個推薦使用第二種。在這做個記錄,有小伙伴有更好的解決方法請留言,遨游在代碼海洋里的小蝦米。。。。。。