1. 程式人生 > >SQL查詢語句萬用字元與ACCESS模糊查詢like的解決方法

SQL查詢語句萬用字元與ACCESS模糊查詢like的解決方法

===================================================
ACCESS庫的萬用字元為:
*   與任何個數的字元匹配
?   與任何單個字母的字元匹配

SQL Server中的萬用字元為:
% 與任何個數的字元匹配
_ 與單個字元匹配
正文
我今天在寫個頁面的時候,也很鬱悶,表中明明有記錄,但在ASP裡就是搜尋不到,理論的sql語句如下:
Select * FROM t_food Where t_food.name like '*蘋果*'
去GOOGLE搜搜發現,ASP中模糊查詢要這樣寫:
Select * FROM t_food Where t_food.name like '%%蘋果%%'

必須是“%”,而且要兩個。大家多注意。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SQL查詢語句萬用字元問題

在Access中用SQL語句進行資料查詢時,用了萬用字元*進行查詢。語句如下:

Select * from normal where bookname like '*h*'

在Access的SQL檢視中試驗沒有任何問題,工作一切正常。於是將SQL語句寫入到C#程式中,結果一到查詢語句時就出錯跳出,百思不得其解。於是查詢Access幫助檔案,找到如下幫助:

////////////////////////////////////////////////////////////

將字串表示式與 SQL 表示式中的模式進行比較。

語法
expression Like "pattern"

Like 運算子語法包含以下部分:

部分說明
expression 在 Where 子句中使用的 SQL 表示式。
pattern 與 expression 進行比較的字串文字。


說明
可以通過 Like 運算子來查詢與所指定的模式相匹配的欄位值。對於 pattern,可以指定完整的值(例如 Like "Smith"),也可以使用萬用字元來查詢某個範圍內的值(例如 Like "Sm*")。

在表示式中,可以使用 Like 運算子來比較欄位值與字串。例如,如果在 SQL 查詢中輸入 Like "C*",那麼該查詢將返回所有以字母 C 開頭的欄位值。在引數查詢中,可以提示使用者鍵入要搜尋的模式。

下面的示例返回以字母 P 開頭並且後面為 A 到 F 之間任何字母以及三個數字的資料:

Like "P[A-F]###"

下表展示瞭如何通過 Like 來測試不同模式的表示式。


匹配型別
模式匹配
(返回 True)不匹配
(返回 False)
多個字元 a*a aa, aBa, aBBBa aBC
   *ab* abc, AABB, Xab aZb, bac
特殊字元 a
a a*a aaa
多個字元 ab* abcdefg, abc cab, aab
單個字元 a?a aaa, a3a, aBa aBBBa
單個數字 a#a a0a, a1a, a2a aaa, a10a
字元範圍 [a-z] f, p, j 2, &
範圍之外 [!a-z] 9, &, % b, a
非數字值 [!0-9] A, a, &, ~ 0, 1, 9
複合值 a[!b-m]# An9, az0, a99 abc, aj0

///////////////////////////////////////////////////////////

幫助都這麼寫了,沒有任何問題啊,到底問題是出在哪裡呢?更加讓本人迷惑。後來問了一下同事說:你的SQL語句錯了,萬用字元應該用%,而不是*。可是幫助裡面說的是*,而且我在Access中試驗一切正常,同事也說不上個所以然來,於是繼續查詢幫助需求答案。在另一個幫助檔案中找到了如下資訊:

///////////////////////////////////////////////////////////

內建的模式匹配方法提供了一個用於字串比較的通用工具。下表中展示了可以用於 Like 運算子的萬用字元,以及與它們匹配的數字和字串。

pattern 中的字元expression 中的匹配項
? 或 _(下劃線) 任何單個字元
* 或 % 零個或多個字元
# 任何單個數字 (0— 9)
[charlist] 在 charlist 中的任何單個字元。
[!charlist] 不在 charlist 中的任何單個字元。


可以使用一組由中括號 ([]) 括住的一個或多個字元(charlist)來匹配在 expression 中的任何單個字元,並且 charlist 可以包含大部分 ANSI 字符集中的字元,包括數字在內。可以通過將特定字元如左方括號 ([)、問號 (?)、數字號 (#) 和星號 (*) 包含於方括號內來直接與這些符號自身進行匹配。不能將右方括號用在一個組中以匹配它自身,但可以將它作為單個字元用於組外。

除了括在方括號中的簡單字元列表外,charlist 可以通過使用連字元號 (-) 來分隔範圍的上界和下界。例如,在 pattern 中使用 [A-Z] 時,如果 expression 中相應的字元包含了任何在 A 到 Z 範圍之間的大寫字元,就能實現匹配。可以在方括號中包含多個範圍而不必為範圍劃界。例如,[a-zA-Z0-9] 可以匹配任何字母數字字元。

請注意,ANSI SQL 萬用字元 (%) 和 (_) 僅在 Microsoft? Jet 4.X 版本和 Microsoft OLE DB Provider for Jet 中才是有效的。如果用在 Microsoft Access 或 DAO 中,那麼它們被視為文字。

其他重要的用於模式匹配的規則如下所示:

在 charlist 的開頭使用感嘆號 (!) 將表示如果在 charlist 以外的任何字元出現在 expression 中,則發生匹配。當它用在方括號的外面時,感嘆號匹配它自身。
可以將連字元號 (-) 用於 charlist 的開頭(感嘆號之後)或末尾以匹配它自身。在其他任何位置中,連字元號標識一個 ANSI 字元範圍。
指定了一個字元範圍時,字元必須以升序排列出現(A-Z 或 0-100)。[A-Z] 是有效的模式,[Z-A] 是無效模式。
忽略字元順序 [ ];它被視為一個零長度字元 ("")。
參考地址:http://office.microsoft.com/zh-cn/assistance/HP010322842052.aspx

///////////////////////////////////////////////////////////////

至此,原因總算是找到了,由於本人在Access中使用萬用字元*一切正常,換成%則不能成功。而C#中則只是支援%萬用字元,而換成*則會出錯!這個問題算不算是一個相容性問題呢?


萬用字元:

萬用字元 描述 示例
% 包含零個或更多字元的任意字串。 Where title LIKE '%computer%' 將查詢處於書名任意位置的包含單詞 computer 的所有書名。
_(下劃線) 任何單個字元。 Where au_fname LIKE '_ean' 將查詢以 ean 結尾的所有 4 個字母的名字(Dean、Sean 等)。
[ ] 指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字元。 Where au_lname LIKE '[C-P]arsen' 將查詢以arsen 結尾且以介於 C 與 P 之間的任何單個字元開始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不屬於指定範圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字元。 Where au_lname LIKE 'de[^l]%' 將查詢以 de 開始且其後的字母不為 l 的所有作者的姓氏。

將萬用字元作為文字使用

可以將萬用字元模式匹配字串用作文字字串,方法是將萬用字元放在括號中。下表顯示了使用 LIKE 關鍵字和 [ ] 萬用字元的示例。

符號 含義
LIKE '5[%]' 5%
LIKE '[_]n' _n
LIKE '[a-cdf]' a、b、c、d 或 f
LIKE '[-acdf]' -、a、c、d 或 f
LIKE '[ [ ]' [
LIKE ']' ]
LIKE 'abc[_]d%' abc_d 和 abc_de
LIKE 'abc[def]' abcd、abce 和 abcf

使用 ESCAPE 子句的模式匹配

可搜尋包含一個或多個特殊萬用字元的字串。例如,customers 資料庫中的 discounts 表可能儲存含百分號 (%) 的折扣值。若要搜尋作為字元而不是萬用字元的百分號,必須提供 ESCAPE 關鍵字和轉義符。例如,一個樣本資料庫包含名為 comment 的列,該列含文字 30%。若要搜尋在 comment 列中的任何位置包含字串 30% 的任何行,請指定由 Where comment LIKE '%30!%%' ESCAPE '!' 組成的 Where 子句。如果不指定 ESCAPE 和轉義符,SQL Server 將返回所有含字串 30 的行。

下例說明如何在 pubs 資料庫 titles 表的 notes 列中搜索字串"50% off when 100 or more copies are purchased":

Select notes FROM titles Where notes LIKE '50%% off when 100 or more copies are purchased' ESCAPE '%'