首字母模糊查询

项目需求


在做人事系统的时候有一个需求,要求能在表格上方的搜索框中实现输入字母能查出以该字母为首字母的中文。刚开始觉得这个需求不是特别重要,后来自己总结整理的时候发现这种用户体验的需求是高效办公系统必须的。其实这种用户体验度的需求,Google和百度已经做到了,我们平时都在使用。

------------------------------------------------------------------------------------------------------

原理分析


----------------------------------------------------------------------------------------------------------------------------------------------------------

知识补充


1、排序规则简介:


       什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server 2000 中,
字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存
储和比较字符所使用的规则。"
  在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。

    select * from ::fn_helpcollations()

排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
  Chinese_PRC_CS_AI_WS 
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义: 
  _BIN 二进制排序 
  _CI(CS) 是否区分大小写,CI不区分,CS区分
  _AI(AS) 是否区分重音,AI不区分,AS区分   
  _KI(KS) 是否区分假名类型,KI不区分,KS区分 
       _WI(WS) 是否区分宽度 WI不区分,WS区分 

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
                 比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项


2、查看数据库中的Unicode字符编码。


select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b
select code,nchar(code) as CNWord from #t


3、查询以a字母作为拼音首字母的汉字


select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b

select code,nchar(code) as CNWord from #t where nchar(code)>='吖' and nchar(code)<'八'

----------------------------------------------------------------------------------------------------------------------------------------------------------


项目实践

实践1(匹配第一中文):


在数据库中编写一个函数

SETANSI_NULLS ON

GO

SETQUOTED_IDENTIFIER ON

GO

CREATEFUNCTION fun_getPY

(

@strNVARCHAR(4000)

)

RETURNSNVARCHAR(4000)

AS

BEGIN

DECLARE@word NCHAR(1),@PYNVARCHAR(4000)

SET@PY=''

WHILElen(@str)>0

BEGIN

SET@word=left(@str,1)

SET@PY=@PY+(CASEWHENunicode(@word)BETWEEN19968 AND 19968+20901

THEN(SELECTTOP1 PYFROM(

SELECT'A' AS PY,N''ASword

UNIONALL SELECT 'B',N'簿'

UNIONALL SELECT 'C',N''

UNIONALL SELECT 'D',N''

UNIONALL SELECT 'E',N''

UNIONALL SELECT 'F',N''

UNIONALL SELECT 'G',N''

UNIONALL SELECT 'H',N''

UNIONALL SELECT 'J',N''

UNIONALL SELECT 'K',N''

UNIONALL SELECT 'L',N''

UNIONALL SELECT 'M',N''

UNIONALL SELECT 'N',N''

UNIONALL SELECT 'O',N''

UNIONALL SELECT 'P',N''

UNIONALL SELECT 'Q',N''

UNIONALL SELECT 'R',N''

UNIONALL SELECT 'S',N''

UNIONALL SELECT 'T',N''

UNIONALL SELECT 'W',N''

UNIONALL SELECT 'X',N''

UNIONALL SELECT 'Y',N''

UNIONALL SELECT 'Z',N''

) T

WHEREword>=@wordCOLLATEChinese_PRC_CS_AS_KS_WS

ORDERBY PYASC)ELSE@word END)

SET@str=right(@str,len(@str)-1)

END

RETURN@PY

END

 

使用方法:

select* from wherefun_getPY(字段)likeN'%zgr%'

例如:

执行:

select * from  dbo.Category where dbo.fun_getPY(CategoryName)like N'%z%'

结果:


实践2(匹配任意一个中文):


在数据库中编写一个函数

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  dbo.Category where dbo.f_GetPy(CategoryName)like N'%z%'

结果:


注:实践2中函数使用的字符是真正字母标识起始和截止的Unicode字符。

------------------------------------------------------------------------------------------------------

总结思考

1、用户体验度是软件很重要的内容。如何实现并不难,关键是能不能想到用户最想要什么。

2、对一些使用频率特别高的技术,不能止步于会使用要有一定深入的了解。这些的学习能让我们事半功倍。


评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值