这个问题其实挺有点意思的,以前做东西的时候从没想过这方面的问题,但是最近接了一个项目客户指定要求对姓名检索的时候必须能够按拼音首字母进行检索,想想也是,汉字里面发音相同的字那么多,按汉字检索的时候就必须得知道具体用的是那个字,再加上中国有那么多的方言,有时候想搞明白别人的名字究竟用的是那个字确实挺纠结的,而且大家用的汉字输入法还各不相同,拼音、五笔的都有,尤其用拼音的有时候为了找一个字得翻半天,要是能直接用拼音字母查询就没这问题了,所以这应该还算是一个操作方面比较实用的小技巧吧。

那么怎么实现按拼音首字母查询呢,要是搁以前,首先想到的肯定是在建库的时候多弄一个字段叫“简码”或者“速查码”之类的用来存放拼音首字母,在输入数据的时候让操作员多录入一点数据,现在见到仍然有很多系统是这么做的,当然这不失为一种简单易行的好办法,唯一的缺点就是操作员得多录入点数据。不过很可惜的是这次的项目要查询的数据是从别人另一个系统共享过来的,而且我们还不能进行修改,所以在单弄个字段显然是不可能的了,那有没有别的办法不加这样的字段也能实现呢,想了想没有什么头绪,没办法跑到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条记录查询要4、5秒钟的时间,那要是400万条记录查询一次还不得等到明年去了,没辙还得另想办法。仔细研究一下上面那段代码,发现人家是遍历了memberinfo表里的所有记录,然后通过f_GetPy函数提取出每条记录name字段的拼音首字母然后和输入的的内容比较,相同的就返回,像这样一条一条记录的转换再比较,难怪速度这么慢呢。

不过看了人家这段代码倒是给我带来了一些灵感,我们都知道数据库查询里面用Order By关键字对汉字进行排序的时候是按照拼音字母顺序进行排序的,既然是按照拼音顺序排列的那么汉字的大小比较也是按拼音来比较的,通过上面那段程序我们不难发现发音为A的第一个汉字是“吖”,发音为B的第一个汉字为“八”,如果我们要查询name字段拼音首字母以A开头的数据直接用

[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”是怎么变成“帀”和“仨”“他”的我就不多说了,除非你不是搞数据库编程的。有兴趣的童鞋可以把这个改成存储过程或者函数,到时候用起来更方便。

作者:三楼一郎 
原文:

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


识别图中二维码,领取python全套视频资料

转载于:https://www.cnblogs.com/IT-Scavenger/p/9947678.html

如何利用拼音首字母查询数据库相关推荐

  1. 利用拼音首字母查询数据库

    数据库查询里面用Order By关键字对汉字进行排序的时候是按照拼音字母顺序进行排序的,既然是按照拼音顺序排列的那么汉字的大小比较也是按拼音来比较的,我们不难发现发音为A的第一个汉字是"吖& ...

  2. mysql 按拼音码查询,MySQL拼音首字母查询

    最近一个项目中有个模块须要实现拼音首字母查询功能,网上查了一下资料,本身从新修改整理了一下,使其知足项目的要求.sql 实现过程以下:函数 1.建立一个获取中英文大写首字母函数:code DROP F ...

  3. mysql简拼查询_MySQL拼音首字母查询_MySQL

    bitsCN.com 最近一个项目中有个模块需要实现拼音首字母查询功能,网上查了一下资料,自己重新修改整理了一下,使其满足项目的要求. 实现过程如下: 1.创建一个获取中英文大写首字母函数: DROP ...

  4. MySQL拼音首字母查询

    最近一个项目中有个模块需要实现拼音首字母查询功能,网上查了一下资料,自己重新修改整理了一下,使其满足项目的要求. 实现过程如下: 1.创建一个获取中英文大写首字母函数: DROP FUNCTION I ...

  5. mysql获取汉字拼音首字母_MySQL数据库获取汉字拼音的首字母函数

    需求简介:最 近的一个项目,想实现如下图所示的显示效果.很明显,如果能够获取对应的汉字词组的拼音首字母就可以实现了,如果是固定的几个汉字,人为的拼一下就可以 了,不过项目中有多处功能是需要这个效果的, ...

  6. MySQL拼音首字母查询(支持三个中文以内的查询)

    #参考这篇博客:http://blog.csdn.net/naruto1021/article/details/17502783,不过这个只支持查询一个中文字母,这是不太符合我的要求,改写如下: 如果 ...

  7. mysql 拼音首字母_MySQL拼音首字母查询(支持三个中文以内的查询)

    #参考这篇博客:http://blog.csdn.net/naruto1021/article/details/17502783,不过这个只支持查询一个中文字母,这是不太符合我的要求,改写如下: 如果 ...

  8. sql中怎么根据汉字的拼音首字母查询

    --可用,速度可以 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fGetPy]') and xtype ...

  9. mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)

    注:不用新建表,查询性能高,可以兼容中英文 简单分析 应用场景:通常对地址或者数量较多的分类会选择首字母查询的方法 性能考虑:PHP中进行首字母查询,网上可以找到很多脚本实现,但需要将所有数据进行读出 ...

最新文章

  1. python电脑下载网址-Python
  2. MyEclipse 16(汉化版)安装教程
  3. python如何离线安装第三方模块_扣丁学堂python开发之第三方模块pip离线安装
  4. hexo github pages 搭建博客
  5. Java 8 Lambda演练
  6. AC自动机-HDU2222-模板题
  7. mysql 分页优化策略(一)
  8. 718. 最长重复子数组(JavaScript)
  9. usermod 修改用户信息
  10. 前端学HTTP之客户端识别和cookie
  11. 切片与MapTask并行度决定机制
  12. [转帖]内网安全克服五重阻碍 迎来春天
  13. 基于C++和EasyX 实现的《双人贪吃蛇》小游戏,你不找个小伙伴陪你一起玩吗?
  14. nod32升级问题解决(20080530)
  15. 解决ios的webview中上/下拉露出黑灰色背景问题
  16. 新手小白纠结要做角色建模还是场景建模比较好?
  17. 寿星万年历源代码(JAVA/VB NET)
  18. 单字节的乘法指令设计汇编程序11*12
  19. 玩玩CUBLAS(1)——hello cublas
  20. 包包的结构制图_怪蜀黍教你做包包 篇四:做好手工皮具的基础——如何打版...

热门文章

  1. 那些高效的机器学习研究者,需要养成什么样的习惯?吴恩达等这样建议
  2. 软件实习实验四 校园一卡通数据库管理系统的开发
  3. Daily Scrum 12.17
  4. 郑大跨专业考研计算机,多所985/211大学计算机考研禁止跨考!新乡寄宿考研
  5. SpaceClaim脚本建模初试(二)
  6. DDR2/3-PCB设计规则
  7. 一个射频工程师应该知道的
  8. 计算机系微积分教材,清华大学出版社-图书详情-《大学数学(微积分)》
  9. 开发才1天,为什么测试需要2天
  10. 通达信全市场数据导入指南—基于股票量化分析工具V2.0!