資料庫管理系統中的模糊查詢技術

才智咖 人氣:2.87W

內容提要 主要介紹在資料庫管理系統中實現模糊查詢的方法與技巧,提供了能實現真正模糊查詢的二個通用函式的源程式,特別是介紹了結構化查詢語言SQL中鮮為人知的萬用字元的使用方法。

資料庫管理系統中的模糊查詢技術

關鍵詞 FoxPro 模糊查詢 SELECT-SQL 萬用字元

在資料庫管理系統中,查詢是一個很重要的內容。然而,在多數情況下人們不能準確知道作為查詢條件的欄位內容,如:某欄位內容為“涪陵師範高等專科學校”,查詢者可能只知道其簡稱“涪陵師專”或“涪師專”,這時,為保證能查到滿足條件的資料記錄,只能進行模糊查詢。下面從程式設計的角度談談在FoxPro 2.5b中,實現模糊查詢的方法。

一、 簡單的模糊查詢方法

① 利用比較操作符“=”進行模糊查詢。先把SET EXACT的設定置為OFF,這時,“=”用於兩個字元表示式之間作比較,其規則是:“=”右邊的字元逐個與“=”左邊相同位置的字元進行比較,只要遇到其中一個字元不相等,或者“=”右邊的字元表示式結束,比較操作就結束。所以,"abc"="abc","abc"="ab","ab_"="ab","ab"=""的比較結果均為邏輯真(.T.)。可見,這種方法的模糊性是不能令人滿意的。

② 利用“$”進行包含比較,其模糊查詢的效果就比用“=”時好得多。這種方法是在“$”右邊的字元表示式中查詢“$”左邊的字元表示式,若找到返回邏輯真(.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字元,所以每次取二個相鄰字元進行測試(讓中的K=2)。這樣做,一是可以減少測試比較的次數,提高程式執行速度。二是當<字串2>中含有數字、字母等半形字元時,可以減少滿足條件的記錄數目,提高查詢的命中率。然而,若查詢條件中含有英文縮寫,則每次只能取一個ASCII字元進行測試(讓中的`K=1)。

本函式的源程式如下:

* 程式名稱:
* 程式功能:比較<字串2>是否為<字串1>的縮略語
* 呼叫格式:ZFBJ(<字串1>,<字串2>)
* 通常<字串1>是一個字元型欄位變數
* 返 回 值:邏輯值 .T. 或 .F.
* 使用環境:FoxPro 2.5b

PARAMETERS D,
PRIVATE ALL
IF (PARAMETERS( ) < 2) ;
OR EMPTY(ALLTRIM(D)) ;
OR EMPTY(ALLTRIM())
RETURN .F.
ENDIF
IF SET("TALK") = "ON"
SET TALK OFF
stat = "ON"

ENDIF
stat = SET("COMPATIBLE")
SET COMPATIBLE FOXPLUS
J = LEN(ALLTRIM())
K=2
FOR I = 1 TO J STEP K
= SUBSTR(ALLTRIM(),I,K)
MCWZ = AT(,ALLTRIM(D))
IF MCWZ<>0
D = SUBSTR(ALLTRIM(D),MCWZ+K)
fhz = .T.
ELSE
fhz = .F.
EXIT
ENDIF
ENDFOR
IF stat = "ON"
SET TALK ON
ENDIF
IF stat = "ON"
SET COMPATIBLE ON
ENDIF
RETURN fhz

使用舉例:設記憶體變數d,其值為使用者輸入的使用者名稱稱的簡稱,如“涪師專”,現在要在中查詢使用者名稱稱(欄位名)為“涪陵師範高等專科學校”,或為“涪陵師專”,或為“涪師專”的全部記錄,可以先將滿足條件的記錄拷貝到一臨時資料庫中,然後再瀏覽,瀏覽完畢刪除臨時資料庫。其程式如下:

d="涪師專"
SELECT 0