关于按姓名笔划排序的问题

SunRoll 2001-10-27 10:32:51
我的SQL SERVER数据库中有一个表中有一个varchar型的字段"姓名",现要求用此字段中姓名笔划来排序,请问该怎么办?
...全文
325 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxl 2001-11-14
  • 打赏
  • 举报
回复
抄自大富翁:

在信息处理中,常会遇到对中文信息按某种要求进行排序,例如对姓名按姓氏笔划排
序。而中文信息的排序较英文信息的排序要复杂许多,ASC II编码的有序性大大方便
英文信息排序的实现,那么要实现中文信息的按笔划排序,就得对中文信息进行重新
编码,这里的编码是指将汉字的内码信息转换为汉字按笔划排序的序号信息,新生成
的编码信息可按ASC II前后次序进行排序,从而实现汉字信息的姓氏笔划排序。

  为了实现汉字信息按姓氏笔划排序,首先需要创建一个全部汉字信息按姓氏笔划
排序的文本文件,然后根据该文本文件的汉字笔划排序的序号信息建立汉字--笔划编
码数据库文件,那么对指定的汉字信息字符串按汉字--笔划编码表转换成为按笔划排
序汉字的编码字符串,只需对编码字符串进行排序,就可实现汉字信息按笔划排序的
目的。
  以Dephi 与SQL Server为例介绍实现上述方法的过程:
  第一步、要创建一个全部汉字信息按姓氏笔划排序的文本文件,可以利用
Microsoft Word 6.0提供的按笔划排序的功能。先用任何一种熟悉的高级编程语言编
写一段能生成全部汉字内码的小程序(别忘了一个汉字一行),用来生成一个按姓氏笔
划排序的文本文件。然后在Word中打开该文件,并选择"表格\排序文字[T]..."这一
菜单项,将弹出一个对话框,这时只需将排序依据的类型设为"笔划"后按"确定"按
钮,那么就可以得到一份按姓氏笔划排序的全部汉字的文本文件。
  第二步:建立汉字--笔划编码数据库文件
  最简单的实现方法是用数据库直接记录汉字信息及其它的序号,从而形成编码表
文件。中文系统中编码汉字的总数大约7000个左右,那么就意味着序号需以长度为4
字节的字符串形式存放,才能保证汉字排序的统一性、可靠性。对于一个5个汉字的字
串而言,就得附加20字节的编码信息用于笔划排序。为了节约存贮空间,可采用百进
制编码方式表示汉字的序号。因为两位百进制数可以表示十进制数的范围是0~9999,
那么只需用两个字符用来分别存放百进制数的第一位和第二位,就可以表示任何一个
汉字的序号,而且这种编码显示是有序的(因为ASCII码是有序的)。同样的一个5个
汉字的字串现在只需附加一个10字节的编码信息用于笔划排序,比起上一种方法,采
用百进制编码方式可节约一半的存贮空间,尤其当数据库需排序的中文信息量较大,
做这样的节约是非常值得的。
  汉字--笔划编码数据库文件:Hzcodedb
  其结构为:

  HZ CHAR 2

  HZCODE CHAR 2

  {建立汉字--笔划编码表}

  hzsrc:Ttable;{按姓氏笔划排序的全部汉字信息文本文件,在Delphi 中可将文
本文件按Table处理}

  hzcodedb:Ttable; // 需生成的汉字--笔划编码数据库

  var

  tmp1,tmp2:string;

  i,k,j:integer;

  begin

  hzsrc.open;

  hzcoded8b.open;

  i:=0;

  tmp:='';tmp1:='';

  Hzsrc.first;

  while not HzSrc.eof do

  begin

  i:=i+1;

  k:=(i div 100);

  tmp1:=char(k+23); //first char

  j:=i-k*100;

  tmp2:=char(j+23); //second char

  tmp:=tmp1+tmp2;

  hzcodedb.append;

  hzcodedb.edit;

  hzcodedb['hz']:=hzsrc['field1'];

  hzcodedb.fieldbyname('hzcode').asstring:=tmp;

  hzcodedb.post;

  hzsrc.next;

  end;

  hzcodedb.close

  hzsrc.close;

  end;

  第三步:建立函数HZconvert( hzstring ),将指定的汉字信息字符串hzstring
转换成为按笔划排序汉字的编码字符串。

  Fuction HZconvert( hzstring: string ) : string ;

  var

  hzorder:string;

  tmp:string;

  i,startindex:integer;

  begin

  i:=length(hzstring);

  startindex:=1;

  hzorder:='';

  while (startindex<=i) do

  begin

  tmp:=copy(hzstring,startindex,2);

  startindex:=startindex+2;

  if hzcodedb.findKey([tmp]) then

  hzorder:=hzOrder+hzcodedb['hzorder']

  else

  hzorder:=hzOrder+'zz';

  end; // end of while

  HZconvert:=hzorder;

  end;// end of function

  在开发应用程序的过程中,以姓名的姓氏笔划排序为例,介绍HZconvert函数使
用。

  在数据库结构中,应包括以下的两项:

  姓名(NAME) VARCHAR 30

  姓名编码(NAMEORDER) VARCHAR 30

  VARCHAR是可变长字符串类型,定义姓名为VARCHAR类型是考虑到姓名的长短不
一,为了能既节约空间,又可以输入较长的姓名,而定义姓名为VARCHAR类型。

  Delphi中只需在TTABLE元件的BeforePost 事件中加入以下的代码就可生成姓名
的笔划编码:

  table1['nameorder']:=HZconvert(table1['name']);

  数据库内容建立完毕后,设置NameOrder为Index,就实现了姓名的按姓氏笔划排
序。
jspxnet 2001-10-28
  • 打赏
  • 举报
回复
gz
Nizvoo 2001-10-28
  • 打赏
  • 举报
回复
直接排序不行?
machin 2001-10-28
  • 打赏
  • 举报
回复

order by 姓名

不行吗??
smhjh 2001-10-27
  • 打赏
  • 举报
回复
关注,我也想知道

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧