论文网首页|会计论文|管理论文|计算机论文|医药学|经济学论文|法学论文|社会学论文|文学论文|教育论文|理学论文|工学论文|艺术论文|哲学论文|文化论文|外语论文|论文格式
中国论文网

用户注册

设为首页

您现在的位置: 中国论文网 >> 计算机论文 >> 计算机应用论文 >> 正文 会员中心
 计算机应用论文   计算机理论论文   计算机网络论文   电子商务论文   软件工程论文   操作系统论文   通信技术论文
数据库管理系统中的模糊查询技术

内容提要 主要介绍在数据库管理系统中实现模糊查询的方法与技巧,提供了能实现真正模糊查询的二个通用函数的源程序,特别是介绍了结构化查询语言sql中鲜为人知的通配符的使用方法。

关键词 foxpro 模糊查询 select-sql 通配符

在数据库管理系统中,查询是一个很重要的内容。然而,在多数情况下人们不能准确知道作为查询条件的字段内容,如:某字段内容为“涪陵师范高等专科学校”,查询者可能只知道其简称“涪陵师专”或“涪师专”,这时,为保证能查到满足条件的数据记录,只能进行模糊查询。下面从编程的角度谈谈在foxpro 2.5b中,实现模糊查询的方法。

一、 简单的模糊查询方法

① 利用比较操作符“=”进行模糊查询。先把set exact的设置置为off,这时,“=”用于两个字符表达式之间作比较,其规则是:“=”右边的字符逐个与“=”左边相同位置的字符进行比较,只要遇到其中一个字符不相等,或者“=”右边的字符表达式结束,比较操作就结束。所以,"abc"="abc","abc"="ab","ab_"="ab","ab"=""的比较结果均为逻辑真(.t.)。可见,这种方法的模糊性是不能令人满意的。

② 利用“$”进行包含比较,其模糊查询的效果就比用“=”时好得多。这种方法是在“$”右边的字符表达式中查找“$”左边的字符表达式,若找到返回逻辑真(.t.),否则返回逻辑假(.f.)。用这种方法只要“$”左边的字符表达式的每一个字符在“$”右边的字符表达式中存在且位置不间断,查找就能成功,然而对于诸如前面提到的“涪陵师专”或“涪师专”之类的简称,其查找结果为逻辑假(.f.)。wwW.11665.coM

由此可见,直接利用“=”和“$”进行比较操作是不能太“模糊”的。

二、查询条件为缩略语或简称的模糊查询方法

缩略语或简称在地名、单位名称中使用非常广泛。通常,缩略语或简称是由全称中的某些排列位置不连续的字符组成的,因此,通过设置不同长度的字符串进行比较的规则,或者利用包含比较符“$”,是不能对缩略语或简称进行模糊查询的。这时可编写一通用的自定义函数,将用户输入的查询条件(<字符串2>)与字符型字段变量(<字符串1>)进行逐字比较,如果<字符串2>是<字符串1>的缩略语或简称,则返回逻辑真(.t.)否则返回逻辑假(.f.),从而实现模糊查询。

下面将作者所编写的自定义函数介绍给读者,以供参考。

设计思想:此函数必须是一个通用函数。为此,执行时可先接受二个参数──<字符串1>和<字符串2>。从<字符串2>的左边开始取其第一、二个字符x1,用at( )函数测试x1在<字符串1>中的位置s1,如果s1不为0,就将<字符串1>中包含x1以及左边部分的字符截掉,并取<字符串2>中的第三、四个字符x2,用at( )函数测试x2在<字符串1>的剩余部分中的位置s2,若s2不为0,就将<字符串1>的剩余部分中包含x2以及左边部分的字符截掉……,直到将<字符串2>中的字符取完并在<字符串1>中测试完为止,最后本函数返回逻辑真(.t.)。在这个过程中只要有一次测试不成功(即sn=0),则退出本函数并返回逻辑假(.f.)。因为一个汉字占二个ascii字符,所以每次取二个相邻字符进行测试(让zfbj.prg中的k=2)。这样做,一是可以减少测试比较的次数,提高程序运行速度。二是当<字符串2>中含有数字、字母等半角字符时,可以减少满足条件的记录数目,提高查询的命中率。然而,若查询条件中含有英文缩写,则每次只能取一个ascii字符进行测试(让zfbj.prg中的k=1)。

本函数的源程序如下:

* 程序名称:zfbj.prg
* 程序功能:比较<字符串2>是否为<字符串1>的缩略语
* 调用格式:zfbj(<字符串1>,<字符串2>)
* 通常<字符串1>是一个字符型字段变量
* 返 回 值:逻辑值 .t. 或 .f.
* 使用环境:foxpro 2.5b

parameters m.field, m.inmc
private all
if (parameters( ) < 2) ;
or empty(alltrim(m.field)) ;
or empty(alltrim(m.inmc))
return .f.
endif
if set("talk") = "on"
set talk off
m.talkstat = "on"

endif
m.compstat = set("compatible")
set compatible foxplus
j = len(alltrim(m.inmc))
k=2
for i = 1 to j step k
m.mc = substr(alltrim(m.inmc),i,k)
mcwz = at(m.mc,alltrim(m.field))
if mcwz<>0
m.field = substr(alltrim(m.field),mcwz+k)
fhz = .t.
else
fhz = .f.
exit
endif
endfor
if m.talkstat = "on"
set talk on
endif
if m.compstat = "on"
set compatible on
endif
return fhz

使用举例:设内存变量m.field,其值为用户输入的用户名称的简称,如“涪师专”,现在要在ktjbk.dbf中查询用户名称(字段名)为“涪陵师范高等专科学校”,或为“涪陵师专”,或为“涪师专”的全部记录,可以先将满足条件的记录拷贝到一临时数据库temp.dbf中,然后再浏览,浏览完毕删除临时数据库temp.dbf。其程序如下:

m.field="涪师专"
select 0
use ktjbk
copy to temp.dbf for zfbj(用户名称,m.field)
select 0
use temp
browse noedit
use
delete file

temp.dbf
select ktjbk
use
通过上面介绍的自定义函数实现了真正的模糊查询,然而令人遗憾的是它的速度表现总使人感到美中不足。幸好在foxpro中引入了结构化查询语言select-sql。

三、 利用foxpro中select-sql语句的模糊查询方法

结构化查询语言sql是foxpro中值得骄傲的特色之一。利用sql的select语句
可以非常方便、极其快速地进行十分复杂的查询操作。特别值得推荐的是elect-sql语句中的where参数支持通配符“%(百分符号)”和“_(下划线符号)”,因此,对于查询条件为缩略语或简称的情况,可以非常简单地实现真正的模糊查询。这里,百分符号“%”代表0个或0个以上的任意字符,下划线符号“_”代表1个任意字符,它们只能与运算符like搭配使用。

使用举例:设内存变量m.field,其值为用户输入的用户名称的简称,如“涪师专”,现在要在ktjbk.dbf中查询用户名称(字段名)为“涪陵师范高等专科学校”,或为“涪陵师专”,或为“涪师专”的全部记录,可以用下面的一段程序实现:

m. field="涪师专"
mc_cxtj="%"
for i=1 to len(alltrim(m.field)) step 2
mc_cxtj=mc_cxtj+substr(alltrim(m.field),i,2)+"%"
endfor
select * ;
from ktjbk ;
where ktjbk.用户名称 like (mc_cxtj) ;
into cursor temp
程序说明:本程序运行时,先将m.field = "涪师专" 中插入四个通配符“%”,得到mc_cxtj ="%涪%师%专%",然后利用sql的select语句,从数据库ktjbk.dbf中选出字段变量“用户名称”符合“%涪%师%专%”格式的所有记录,输出到一个虚拟临时数据库temp.dbf中。

利用foxpro中的结构化查询语言select-sql可以编写出很漂亮的通用查询程序。笔者在数据库管理系统的开发实践中,曾用foxpro的屏幕生成器编写过一通用查询程序,其通用性和执行速度表现都非常好(本人愿抛砖引玉,奉献给有兴趣的《软件世界》读者,见附录),限于篇幅这里就不详细介绍了。

附录:《一个真正的通用查询程序》见磁盘文件tycx.txt(纯文本文件)或
tycx.doc(word97文档)

参考文献:

1. 江英,杨欣 等翻译. foxpro 2.5 使用与参考大全,清华大学出版社,1995
2. 章立民. foxpro 2.5 for dos 程序设计——提高篇,人民邮电出版社,1994

  • 上一个计算机论文:
  • 下一个计算机论文:
  •  作者:李伯恒 [标签: 数据库管理系统 中的 模糊 查询 技术 ]
    姓 名: *
    E-mail:
    评 分: 1分 2分 3分 4分 5分
    评论内容:
    发表评论请遵守中国各项有关法律法规,评论内容只代表网友个人观点,与本网站立场无关。
    有关计算机软件数据接口的应用研究
    数据快速压缩算法的研究以及C语言实现
    数据库系统中SQL语句的优化技术
    如何利用数据库及ASP技术类构建多功能网站
    招生数据处理系统解决方案
    浅析计算机网络数据库安全技术方案浅探
    试论基于数据挖掘技术的保护设备故障信息管
    试论高职计算机信息管理专业《数据库技术》
    试论网络数据信息管理软件中间层设计
    利用Geoway—Checker软件设计1:5千缩编1:
    infobright: 基于mysql的数据仓库综述
    数据中心网络中的无线通信技术
    | 设为首页 | 加入收藏 | 联系我们 | 网站地图 | 手机版 | 论文发表

    Copyright 2006-2013 © 毕业论文网 All rights reserved 

     [中国免费论文网]  版权所有