理想乡

Sql中通过首拼查询姓名的方法

在一些查询系统里面,有时候需要通过拼音首拼对姓名进行检索。

对于这个问题,首先能想到的是:1.记录里面有对应的简码字段,2.对所有记录的姓名进行转换。

如果有简码字段当然是万事大吉了,想都不用想了。在没有简码的时候,对所有姓名进行即时转换对性能的影响肯定是不小的。下面就列出一个比较常见的转换:

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'

不到万不得已,肯定是不会用上面的方法的。我在一篇文章看到一个不错的方法- 如何利用拼音首字母查询数据库

里面说到数据库中order by对汉字是按照拼音字母的顺序进行排序的,那么我们就可以把首拼字母转换成对应的基准汉字来比较。

通过上面那段程序我们不难发现发音为A的第一个汉字是“吖”,发音为B的第一个汉字为“八”,如果我们要查询name字段拼音首字母以A开头的数据直接用

select * from [memberinfo] where [name]>='吖' and [name]<'八'

同理,查找"ZS"就是:

select * from [memberinfo] where len([name])>=2 and left([name],1)>='帀' and right(left([name],2),1)>='仨' and right(left([name],2),1)<'他'

最终我的方案就是:把'吖'、'八'这样的基准汉字放入键值对,根据提交的首拼转换成汉字,然后根据字数拼接出Sql语句查询。

分类: 代码生活

无题·一 » « CefSharp控件启用缓存目录保存localstorage

1 评论

  1. 提前祝您新年快乐。
    乙未年(羊)冬月十九 2015-12-29

发表评论

您的电子邮件地址不会被公开

*

Copyright © 2017 理想乡

Theme by Anders Noren顶部 ↑