如何利用拼音首字母查詢數據庫

這個問題其實挺有點意思的,之前作東西的時候從沒想過這方面的問題,可是最近接了一個項目客戶指定要求對姓名檢索的時候必須可以按拼音首字母進行檢索,想一想也是,漢字裏面發音相同的字那麼多,按漢字檢索的時候就必須得知道具體用的是那個字,再加上中國有那麼多的方言,有時候想搞明白別人的名字究竟用的是那個字確實挺糾結的,並且你們用的漢字輸入法還各不相同,拼音、五筆的都有,尤爲用拼音的有時候爲了找一個字得翻半天,要是能直接用拼音字母查詢就沒這問題了,因此這應該還算是一個操做方面比較實用的小技巧吧。python

那麼怎麼實現按拼音首字母查詢呢,要是擱之前,首先想到的確定是在建庫的時候多弄一個字段叫「簡碼」或者「速查碼」之類的用來存放拼音首字母,在輸入數據的時候讓操做員多錄入一點數據,如今見到仍然有不少系統是這麼作的,固然這不失爲一種簡單易行的好辦法,惟一的缺點就是操做員得多錄入點數據。不過很惋惜的是此次的項目要查詢的數據是從別人另外一個系統共享過來的,並且咱們還不能進行修改,因此在單弄個字段顯然是不可能的了,那有沒有別的辦法不加這樣的字段也能實現呢,想了想沒有什麼頭緒,沒辦法跑到CSDN上問了問,別人給提供了一段SQL Server的自定義函數代碼數據庫

[vb] view plain copy
if object_id('[memberinfo]') is not null drop table [memberinfo]  
go  
create table [memberinfo]([ID] int,[name] varchar(4))  
insert [memberinfo]  
select 1,'張三' union all  
select 2,'李四' union all  
select 3,'王五' union all  
select 4,'賀六'  

create function   f_GetPy(@str   nvarchar(4000))   
returns   nvarchar(4000)   
as   
begin   
declare   @strlen   int,@re   nvarchar(4000)   
declare   @t   table(chr   nchar(1)   collate   Chinese_PRC_CI_AS,letter   nchar(1))   
insert   into   @t(chr,letter)   
    select   '吖 ', 'A '   union   all   select   '八 ', 'B '   union   all   
    select   '嚓 ', 'C '   union   all   select   '咑 ', 'D '   union   all   
    select   '妸 ', 'E '   union   all   select   '發 ', 'F '   union   all   
    select   '旮 ', 'G '   union   all   select   '鉿 ', 'H '   union   all   
    select   '丌 ', 'J '   union   all   select   '咔 ', 'K '   union   all   
    select   '垃 ', 'L '   union   all   select   '嘸 ', 'M '   union   all   
    select   '拏 ', 'N '   union   all   select   '噢 ', 'O '   union   all   
    select   '妑 ', 'P '   union   all   select   '七 ', 'Q '   union   all   
    select   '呥 ', 'R '   union   all   select   '仨 ', 'S '   union   all   
    select   '他 ', 'T '   union   all   select   '屲 ', 'W '   union   all   
    select   '夕 ', 'X '   union   all   select   '丫 ', 'Y '   union   all   
    select   '帀 ', 'Z '   
    select   @strlen=len(@str),@re= ' '   
    while   @strlen> 0   
    begin   
        select   top   1   @re=letter+@re,@strlen=@strlen-1   
            from   @t   a   where   chr <=substring(@str,@strlen,1)   
            order   by   chr   desc   
        if   @@rowcount=0   
            select   @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1   
    end   
    return(@re)   
end   

---查詢---  
select   
  *   
from   
  [memberinfo]  
where  
  dbo.f_GetPy(name)='ZS'  

試了一下,沒問題徹底能夠實現,不過就是速度嘛太慢鳥,纔不到4000條記錄查詢要四、5秒鐘的時間,那要是400萬條記錄查詢一次還不得等到明年去了,沒轍還得另想辦法。仔細研究一下上面那段代碼,發現人家是遍歷了memberinfo表裏的全部記錄,而後經過f_GetPy函數提取出每條記錄name字段的拼音首字母而後和輸入的的內容比較,相同的就返回,像這樣一條一條記錄的轉換再比較,難怪速度這麼慢呢。編程

不過看了人家這段代碼卻是給我帶來了一些靈感,咱們都知道數據庫查詢裏面用Order By關鍵字對漢字進行排序的時候是按照拼音字母順序進行排序的,既然是按照拼音順序排列的那麼漢字的大小比較也是按拼音來比較的,經過上面那段程序咱們不難發現發音爲A的第一個漢字是「吖」,發音爲B的第一個漢字爲「八」,若是咱們要查詢name字段拼音首字母以A開頭的數據直接用app

[vb] view plain copy
select * from [memberinfo] where [name]>='吖' and [name]<'八'  
同理,上面的「select * from   [memberinfo] where  dbo.f_GetPy(name)='ZS'」改爲
[vb] view plain copy
select * from [memberinfo] where len([name])>=2 and left([name],1)>='帀' and right(left([name],2),1)>='仨' and right(left([name],2),1)<'他'  

查詢速度瞬間提高了N倍,爽啊!雖然構造出來的查詢語句變得複雜了,可是查詢的效率真不是蓋的,反正客戶只要求支持姓名的拼音首字母查詢,鑑於中國人除部分少數民族的名字比較長之外基本都是2-3個漢字的,因此構造出來的查詢語句即使在複雜也複雜不到哪去,至於上面的「Z」「S」是怎麼變成「帀」和「仨」「他」的我就很少說了,除非你不是搞數據庫編程的。有興趣的童鞋能夠把這個改爲存儲過程或者函數,到時候用起來更方便。函數

做者:三樓一郎 
原文:spa

https://blog.csdn.net/citybird/article/details/6021089?utm_source=copy .net


識別圖中二維碼,領取python全套視頻資料

相關文章
相關標籤/搜索