如何在 SQL 查詢中使用萬用字元,使動態集 (& I) 快照集

文章翻譯 文章翻譯
文章編號: 110069 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

您可以建置一個動態集 (Dynaset) 或快照集依據 SQL 查詢中的萬用字元欄位搜尋字元。動態集 (Dynaset) 或在 SQL 查詢中使用萬用字元搜尋的快照集,也可以搜尋尋找方法 (FindFirst、 FindLast、 FindNext 及 FindPrevious)。

其他相關資訊

您可以使用 Like 的陳述式以 SQL 查詢語言,您可以搜尋使用星號 (*) 和問號 (?) 的資料庫欄位值 作為萬用字元的字元。* 和?萬用字元可以讓您尋找寬組的開始或結束任何您想要的根的欄位值。下列的 SQL 語法,例如從 Authorfield 欄位值開頭字母 b:
   Select * from XTable Where Authorfield Like 'b*'
注意: [搜尋方法,這只適用於資料表的物件變數,無法使用 SQL 查詢或萬用字元搜尋。Seek 方法受限於尋找單一資料錄使用比較運算子: >,> =,< =,<,=,和 < >。

星號 (*) 萬用字元的使用方式

在 SQL 語法 Like 陳述式中,星號 (*) 做為萬用字元預留位置的任何從零到欄位長度最多的字元數目。搜尋的 b * 會尋找字母 b 任何欄位值開頭。搜尋的 * b 找出並以 b 結束任何欄位值。搜尋的 * xxxx * 會尋找包含 xxxx 子字串的任何欄位值。搜尋的 * 單獨比對所有的欄位值。

問號 (?)萬用字元使用狀況

在 SQL 語法 Like 陳述式中,問號 (?) 作為萬用字元預留位置的單一字元。搜尋 = 開頭。b * 會尋找有 b 中第三個字元的任何欄位值。為查詢 * b = 開頭。為從最後一個字元,第三個尋找 b 與任何欄位值。

速度考量

下列的兩種技術的 1 會比 2 更快:

  1. 針對較大的速度叫用來建置動態集 (Dynaset) 或快照集的符合搜尋準則的記錄的 SQL 萬用字元欄位搜尋一次。然後使用快速移動方法 (MoveFirst、 MoveLast、 MoveNext 及 MovePrevious),或按一下 [資料] 控制項,以符合指定的搜尋準則的所有記錄間快速瀏覽。例如:
       Dim MyDS As Dynaset, MyDB As database, SQLx As String
       SQLx = "Select * from Authors Where Author Like 'b*' "
       Set MyDB = OpenDatabase("BIBLIO.MDB")   'Open a database.
       Set MyDS = MyDB.CreateDynaset(SQLx)     'Create Dynaset using SQLx.
       While Not MyDS.Eof
          Print MyDS!author
          MyDS.MoveNext
       Wend
    [Eof 屬性為 True,過去的最後一筆記錄移動 MoveNext 之後。

    Visual Basic 建立動態集 (Dynaset) 或快照集非常迅速地使用索引時。後續的尋找方法是相當緩慢且循序,以下的技巧 2 所示。
  2. 較慢的技術是建立一個動態集 (Dynaset) 組成 [整張表格,然後使用多重尋找方法。每個 FindNext 會 re-invoke SQL 萬用字元欄位搜尋來尋找下一個相符的記錄。這樣會增加查詢時間的額外負荷。之後尋找特定數量的資料錄,所花費的總時間會比 1 上面所描述的技巧與更慢。
       Dim MyDS As Dynaset, MyDB As Database, SQLx As String
       SQLx = "author Like 'b*'"
       Set MyDB = OpenDatabase("BIBLIO.MDB")     'Open a database.
       Set MyDS = MyDB.CreateDynaset("Authors")  'Create Dynaset with table.
       MyDS.FindFirst SQLx      'Find first record matching criteria.
       Do Until MyDS.NoMatch
          Print MyDS!author
          MyDS.FindNext SQLx    'Find next record matching criteria.
       Loop
    直到 Nomatch 叫用 FindNext 方法 = True,如所示。

資料控制項中使用 SQL 萬用字元搜尋範例

下列程式的 [文字 1] 方塊會顯示 BIBLIO.MDB 資料庫的 [作者] 欄位的個別記錄。當您按一下 [Command1 按鈕程式會自動將附加至],而且開頭 * 萬用字元搜尋字元,以在 [文字 2] 的 [文字] 方塊中輸入任何搜尋字串。 擴大後產生的資料錄集文字 1] 所示。您可以瀏覽藉由按一下資料控制項所示文字 1 的資料錄集。

  1. 啟動 Visual Basic 或開始新的專案。預設會建立 Form1。
  2. 連按兩下表單。將下列程式碼加入至表單的 Load 事件程式碼:
       Sub Form_Load ()
          text1.Text = "Enter ar* in Text2 and click Command1. Also try *z* "
          text2.Text = "*"  'A lone asterisk finds all records.
       End Sub
  3. 將資料控制項 (Data1) 加入至 Form1。
  4. 將文字方塊 (文字 1) 加入 Form1。提供文字 1 的設定,下列屬性給資料控制項,並資料庫資料表中的 [作者] 欄位,將它繫結:
       DataSource = Data1
       DataField = Author
  5. 新增第二個文字方塊 ([文字 2]) 而不設定任何屬性。您可以在執行階段變更在 [文字 2] 中的資料庫查詢的萬用字元準則。
  6. 將指令按鈕 (Command1) 加入 Form1。將下列程式碼加入至其 Click 事件:
       Sub Command1_Click ()
    
          Dim SQLX As String, SearchText As String
    
          'Optional: In Text2, append & prefix the * wildcard to widen search:
          If Right$(text2.Text, 1) <> "*" Then text2.Text = text2.Text & "*"
          If Left$(text2.Text, 1) <> "*" Then text2.Text = "*" & text2.Text
          'Remove the above 2 lines if you want the user to enter the asterisk
          SearchText = text2.Text
    
          ' The following SQL syntax selects all records from the Authors table
          ' where the Author field matches the SearchText string, using any *
          ' or ? wildcard characters. The result is ordered by the Au_id field:
          SQLx = "Select * From Authors Where Author Like '" & SearchText
          SQLx = SQLx & "' Order By Au_id"
          Data1.DatabaseName = "biblio.mdb" ' Tells Data1 the database name.
          Data1.RecordSource = SQLx ' Data1 control will use SQLx query string.
          Data1.Refresh ' Update the data control with results of SQL query.
    
       End Sub
  7. 藉由按下 F5 鍵啟動程式。當像星號 (*) 是在 [文字 2] 方塊中時,按一下 Command1] 按鈕找出所有記錄。

    在 [文字 2] 中輸入 ar 並按一下 Command1。該程式會變更查詢,以 * ar *。尋找所有作者包含字母 ar 的欄位值。

    輸入 z 或 * z * 按一下 Command1 若要尋找所有作者含有字母欄位中的任何位置的 z 的欄位值。

    關閉表單以結束程式。
若要變更程式會自動加入的方式 * 萬用字元,您可以修改或移除 [如果左 $...,而且如果...右 $ 陳述式。

Seek 方法並不支援萬用字元搜尋

Seek 方法只能搭配表格物件變數,這非常快速,但並不支援萬用字元搜尋。搜尋主要是用於尋找單一資料錄符合一個提供的條件。「 尋找 」 和 「 移動方法都比 Seek 方法來找出一組記錄更為實用的。

萬用字元搜尋最接近 [Seek 方法功能是比較運算子: >,> =,< =,或 <。比方說,您可以找到是大於或等於搜尋機碼值,如下所示的第一筆記錄:
   Dim MyDB As Database, MyTable As Table
   Set MyDB = OpenDatabase("BIBLIO.MDB")      ' Open a database.
   Set MyTable = MyDB.OpenTable("Publishers") ' Open a table.
   MyTable.Index = "PrimaryKey"               ' Define current index.
   MyTable.Seek ">=", 3         ' Seek a record with PrimaryKey >= 3.
   If MyTable.NoMatch Then

      MsgBox "match was not found"
   Else
      MsgBox "match was found"
   End If

屬性

文章編號: 110069 - 上次校閱: 2003年1月9日 - 版次: 1.1
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 3.0 Professional Edition
關鍵字:?
kbmt KB110069 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:110069
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com