美章網(wǎng) 資料文庫(kù) 數(shù)據(jù)庫(kù)管治系統(tǒng)中的查詢技術(shù)范文

數(shù)據(jù)庫(kù)管治系統(tǒng)中的查詢技術(shù)范文

本站小編為你精心準(zhǔn)備了數(shù)據(jù)庫(kù)管治系統(tǒng)中的查詢技術(shù)參考范文,愿這些范文能點(diǎn)燃您思維的火花,激發(fā)您的寫(xiě)作靈感。歡迎深入閱讀并收藏。

數(shù)據(jù)庫(kù)管治系統(tǒng)中的查詢技術(shù)

內(nèi)容提要主要介紹在數(shù)據(jù)庫(kù)管理系統(tǒng)中實(shí)現(xiàn)模糊查詢的方法與技巧,提供了能實(shí)現(xiàn)真正模糊查詢的二個(gè)通用函數(shù)的源程序,特別是介紹了結(jié)構(gòu)化查詢語(yǔ)言SQL中鮮為人知的通配符的使用方法。

關(guān)鍵詞FoxPro模糊查詢SELECT-SQL通配符

在數(shù)據(jù)庫(kù)管理系統(tǒng)中,查詢是一個(gè)很重要的內(nèi)容。然而,在多數(shù)情況下人們不能準(zhǔn)確知道作為查詢條件的字段內(nèi)容,如:某字段內(nèi)容為“涪陵師范高等專科學(xué)校”,查詢者可能只知道其簡(jiǎn)稱“涪陵師專”或“涪師專”,這時(shí),為保證能查到滿足條件的數(shù)據(jù)記錄,只能進(jìn)行模糊查詢。下面從編程的角度談?wù)勗贔oxPro2.5b中,實(shí)現(xiàn)模糊查詢的方法。

一、簡(jiǎn)單的模糊查詢方法

①利用比較操作符“=”進(jìn)行模糊查詢。先把SETEXACT的設(shè)置置為OFF,這時(shí),“=”用于兩個(gè)字符表達(dá)式之間作比較,其規(guī)則是:“=”右邊的字符逐個(gè)與“=”左邊相同位置的字符進(jìn)行比較,只要遇到其中一個(gè)字符不相等,或者“=”右邊的字符表達(dá)式結(jié)束,比較操作就結(jié)束。

所以,"abc"="abc","abc"="ab","ab_"="ab","ab"=""的比較結(jié)果均為邏輯真(.T.)。可見(jiàn),這種方法的模糊性是不能令人滿意的。

②利用“$”進(jìn)行包含比較,其模糊查詢的效果就比用“=”時(shí)好得多。這種方法是在“$”右邊的字符表達(dá)式中查找“$”左邊的字符表達(dá)式,若找到返回邏輯真(.T.),否則返回邏輯假(.F.)。用這種方法只要“$”左邊的字符表達(dá)式的每一個(gè)字符在“$”右邊的字符表達(dá)式中存在且位置不間斷,查找就能成功,然而對(duì)于諸如前面提到的“涪陵師專”或“涪師專”之類的簡(jiǎn)稱,其查找結(jié)果為邏輯假(.F.)。

由此可見(jiàn),直接利用“=”和“$”進(jìn)行比較操作是不能太“模糊”的。

二、查詢條件為縮略語(yǔ)或簡(jiǎn)稱的模糊查詢方法

縮略語(yǔ)或簡(jiǎn)稱在地名、單位名稱中使用非常廣泛。通常,縮略語(yǔ)或簡(jiǎn)稱是由全稱中的某些排列位置不連續(xù)的字符組成的,因此,通過(guò)設(shè)置不同長(zhǎng)度的字符串進(jìn)行比較的規(guī)則,或者利用包含比較符“$”,是不能對(duì)縮略語(yǔ)或簡(jiǎn)稱進(jìn)行模糊查詢的。這時(shí)可編寫(xiě)一通用的自定義函數(shù),將用戶輸入的查詢條件(<字符串2>)與字符型字段變量(<字符串1>)進(jìn)行逐字比較,如果<字符串2>是<字符串1>的縮略語(yǔ)或簡(jiǎn)稱,則返回邏輯真(.T.)否則返回邏輯假(.F.),從而實(shí)現(xiàn)模糊查詢。

下面將作者所編寫(xiě)的自定義函數(shù)介紹給讀者,以供參考。

設(shè)計(jì)思想:此函數(shù)必須是一個(gè)通用函數(shù)。為此,執(zhí)行時(shí)可先接受二個(gè)參數(shù)──<字符串1>和<字符串2>。從<字符串2>的左邊開(kāi)始取其第一、二個(gè)字符X1,用AT()函數(shù)測(cè)試X1在<字符串1>中的位置S1,如果S1不為0,就將<字符串1>中包含X1以及左邊部分的字符截掉,并取<字符串2>中的第三、四個(gè)字符X2,用AT()函數(shù)測(cè)試X2在<字符串1>的剩余部分中的位置S2,若S2不為0,就將<字符串1>的剩余部分中包含X2以及左邊部分的字符截掉……,直到將<字符串2>中的字符取完并在<字符串1>中測(cè)試完為止,最后本函數(shù)返回邏輯真(.T.)。在這個(gè)過(guò)程中只要有一次測(cè)試不成功(即Sn=0),則退出本函數(shù)并返回邏輯假(.F.)。因?yàn)橐粋€(gè)漢字占二個(gè)ASCII字符,所以每次取二個(gè)相鄰字符進(jìn)行測(cè)試(讓ZFBJ.PRG中的K=2)。這樣做,一是可以減少測(cè)試比較的次數(shù),提高程序運(yùn)行速度。二是當(dāng)<字符串2>中含有數(shù)字、字母等半角字符時(shí),可以減少滿足條件的記錄數(shù)目,提高查詢的命中率。然而,若查詢條件中含有英文縮寫(xiě),則每次只能取一個(gè)ASCII字符進(jìn)行測(cè)試(讓ZFBJ.PRG中的K=1)。

本函數(shù)的源程序如下:

*程序名稱:ZFBJ.PRG

*程序功能:比較<字符串2>是否為<字符串1>的縮略語(yǔ)

*調(diào)用格式:ZFBJ(<字符串1>,<字符串2>)

*通常<字符串1>是一個(gè)字符型字段變量

*返回值:邏輯值.T.或.F.

*使用環(huán)境:FoxPro2.5b

PARAMETERSm.FIELD,m.INMC

PRIVATEALL

IF(PARAMETERS()<2);

OREMPTY(ALLTRIM(m.FIELD));

OREMPTY(ALLTRIM(m.INMC))

RETURN.F.

ENDIF

IFSET("TALK")="ON"

SETTALKOFF

m.talkstat="ON"

pstat=SET("COMPATIBLE")

SETCOMPATIBLEFOXPLUS

J=LEN(ALLTRIM(m.INMC))

K=2

FORI=1TOJSTEPK

m.MC=SUBSTR(ALLTRIM(m.INMC),I,K)

MCWZ=AT(m.MC,ALLTRIM(m.FIELD))

IFMCWZ<>0

m.FIELD=SUBSTR(ALLTRIM(m.FIELD),MCWZ+K)

fhz=.T.

ELSE

fhz=.F.

EXIT

ENDIF

ENDFOR

IFm.talkstat="ON"

SETTALKON

ENDIF

pstat="ON"

SETCOMPATIBLEON

ENDIF

RETURNfhz

使用舉例:設(shè)內(nèi)存變量m.field,其值為用戶輸入的用戶名稱的簡(jiǎn)稱,如“涪師專”,現(xiàn)在要在KTJBK.DBF中查詢用戶名稱(字段名)為“涪陵師范高等專科學(xué)校”,或?yàn)椤案⒘陰煂!保驗(yàn)椤案煂!钡娜坑涗洠梢韵葘M足條件的記錄拷貝到一臨時(shí)數(shù)據(jù)庫(kù)TEMP.DBF中,然后再瀏覽,瀏覽完畢刪除臨時(shí)數(shù)據(jù)庫(kù)TEMP.DBF。其程序如下:

m.field="涪師專"

SELECT0

USEKTJBK

COPYTOTEMP.DBFFORZFBJ(用戶名稱,m.field)

SELECT0

USETEMP

BROWSENOEDIT

USE

DELETEFILE

TEMP.DBF

SELECTKTJBK

USE

通過(guò)上面介紹的自定義函數(shù)實(shí)現(xiàn)了真正的模糊查詢,然而令人遺憾的是它的速度表現(xiàn)總使人感到美中不足。幸好在FoxPro中引入了結(jié)構(gòu)化查詢語(yǔ)言SELECT-SQL。

三、利用FoxPro中SELECT-SQL語(yǔ)句的模糊查詢方法

結(jié)構(gòu)化查詢語(yǔ)言SQL是FoxPro中值得驕傲的特色之一。利用SQL的SELECT語(yǔ)句可以非常方便、極其快速地進(jìn)行十分復(fù)雜的查詢操作。特別值得推薦的是ELECT-SQL語(yǔ)句中的WHERE參數(shù)支持通配符“%(百分符號(hào))”和“_(下劃線符號(hào))”,因此,對(duì)于查詢條件為縮略語(yǔ)或簡(jiǎn)稱的情況,可以非常簡(jiǎn)單地實(shí)現(xiàn)真正的模糊查詢。這里,百分符號(hào)“%”代表0個(gè)或0個(gè)以上的任意字符,下劃線符號(hào)“_”代表1個(gè)任意字符,它們只能與運(yùn)算符LIKE搭配使用。

使用舉例:設(shè)內(nèi)存變量m.field,其值為用戶輸入的用戶名稱的簡(jiǎn)稱,如“涪師專”,現(xiàn)在要在KTJBK.DBF中查詢用戶名稱(字段名)為“涪陵師范高等專科學(xué)校”,或?yàn)椤案⒘陰煂!保驗(yàn)椤案煂!钡娜坑涗洠梢杂孟旅娴囊欢纬绦驅(qū)崿F(xiàn):

m.field="涪師專"

mc_cxtj="%"

FORi=1TOLEN(ALLTRIM(m.field))STEP2

mc_cxtj=mc_cxtj+SUBSTR(ALLTRIM(m.field),i,2)+"%"

ENDFOR

SELECT*;

FROMKTJBK;

WHEREKTJBK.用戶名稱LIKE(mc_cxtj);

INTOCURSORTEMP

程序說(shuō)明:本程序運(yùn)行

時(shí),先將m.field="涪師專"中插入四個(gè)通配符“%”,得到mc_cxtj="%涪%師%專%",然后利用SQL的SELECT語(yǔ)句,從數(shù)據(jù)庫(kù)KTJBK.DBF中選出字段變量“用戶名稱”符合“%涪%師%專%”格式的所有記錄,輸出到一個(gè)虛擬臨時(shí)數(shù)據(jù)庫(kù)TEMP.DBF中。

利用FoxPro中的結(jié)構(gòu)化查詢語(yǔ)言SELECT-SQL可以編寫(xiě)出很漂亮的通用查詢程序。筆者在數(shù)據(jù)庫(kù)管理系統(tǒng)的開(kāi)發(fā)實(shí)踐中,曾用FoxPro的屏幕生成器編寫(xiě)過(guò)一通用查詢程序,其通用性和執(zhí)行速度表現(xiàn)都非常好(本人愿拋磚引玉,奉獻(xiàn)給有興趣的《軟件世界》讀者,見(jiàn)附錄),限于篇幅這里就不詳細(xì)介紹了。

主站蜘蛛池模板: www.天天干.com| 啊~用力cao我cao烂我小婷| 久久精品国产福利电影网| 美女脱下裤子让男人捅| 大豆网52dun怪汉网如如| 亚洲av最新在线观看网址| 久久波多野结衣| 成人免费福利视频| 亚洲色中文字幕在线播放| 国产日本在线视频| 小草视频免费观看| 亚洲人成人77777网站| 色8久久人人97超碰香蕉987| 天天射天天干天天操| 五月丁六月停停| 精品亚洲一区二区三区在线观看| 天天躁日日躁狠狠躁av麻豆| 亚洲国产欧美日韩第一香蕉| 被义子侵犯的漂亮人妻中字| 天天爱添天天爱添天天爱添| 亚洲欧美日韩综合在线播放| 高清一级毛片免免费看| 好日子在线观看视频大全免费| 亚洲欧洲美洲无码精品VA| 黄页网站在线观看视频| 成人免费在线视频| 亚洲一区精品无码| 精品999久久久久久中文字幕| 国产视频999| 中文字幕亚洲综合久久| 欧美成人看片一区二区三区| 国产一区二区三区精品视频| yy6080新视觉旧里番高清资源| 欧美性大战久久久久久久| 啊公交车坐最后一排被c视频| 99久久伊人精品综合观看| 日产精品99久久久久久| 亚洲欧美另类久久久精品能播放的| 麻豆av一区二区三区| 夜夜高潮夜夜爽夜夜爱爱| 国产欧美一区二区三区在线看|