数据库管理系统中模糊查询技术的正确

点赞:11410 浏览:45760 近期更新时间:2024-04-05 作者:网友分享原创网站原创

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

数据库管理系统中模糊查询技术的正确参考属性评定
有关论文范文主题研究: 关于数据库的论文例文 大学生适用: 专升本论文、高校毕业论文
相关参考文献下载数量: 26 写作解决问题: 怎么写
毕业论文开题报告: 标准论文格式、论文设计 职称论文适用: 期刊发表、初级职称
所属大学生专业类别: 怎么写 论文题目推荐度: 优秀选题

【关 键 词 】:数据库;系统;模糊查询

中图分类号:TP3 文献标识码:E 文章编号:1006-0510(2008)09059-02

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

一、简单的模糊查询方法

1. 利用比较操作符"等于"进行模糊查询

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

2. 利用"$"进行包含比较,其模糊查询的效果就比用"等于"时好得多

这种方法是在"$"右边的字符表达式中查找"$"左边的字符表达式,若找到返回逻辑真(.T.),否则返回逻辑检测(.F.).用这种方法只要"$"左边的字符表达式的每一个字符在"$"右边的字符表达式中存在且位置不间断,查找就能成功,然而对于诸如前面提到的"涪陵师专"或"涪师专"之类的简称,其查找结果为逻辑检测(.F.).


由此可见,直接利用"等于"和"$"进行比较操作是不能太"模糊"的.

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

缩略语或简称在地名、单位名称中使用非常广泛.通常,缩略语或简称是由全称中的某些排列位置不连续的字符组成的,因此,通过设置不同长度的字符串进行比较的规则,或者利用包含比较符"$",是不能对缩略语或简称进行模糊查询的.这时可编写一通用的自定义函数,将用户输入的查询条件(<字符串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.省略pstat 等于 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.省略pstat 等于 "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的屏幕生成器编写过一通用查询程序,其通用性和执行速度表现都非常好.