我今天在寫個頁面的時候,也很鬱悶,表中明明有記錄,但在ASP裡就是搜尋不到,原來是因為access與SQL的查詢語句通配符問題不同所引起的。
ACCESS的通配符和SQL SERVER的通配符比較
==================================================== =
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[AF]###
下表展示如何透過Like 來測試不同模式的表達式。
匹配類型
模式匹配
(返回True)不匹配
(返回False)
多個字元a*a aa, aBa, aBBBa aBC
*ab* abc, AABB, Xab aZb, bac
特殊字元a
aa*a aaa
多個字元ab* abcdefg, abc cab, aab
單一字元a?a aaa, a3a, aBa aBBBa
單一數字a#a a0a, a1a, a2a aaa, a10a
字元範圍[az] f, p, j 2, &
範圍之外[!az] 9, &, % b, a
非數字值[!0-9] A, a, &, ~ 0, 1, 9
複合值a[!bm]# An9, az0, a99 abc, aj0
參考網址:http://office.microsoft.com/zh-cn/assistance/HP010322532052.aspx
////////////////////////////////////////////////// /////////
幫助都這麼寫了,沒有任何問題啊,到底問題是出在哪裡呢?更加讓本人迷惑。後來問了一下同事說:你的SQL語句錯了,通配符應該要用%,而不是*。可是幫助裡面說的是*,而且我在Access中試驗一切正常,同事也說不上個所以然來,於是繼續查找幫助需求答案。在另一個幫助文件中找到瞭如下資訊:
////////////////////////////////////////////////// /////////
內建的模式匹配方法提供了一個用於字串比較的通用工具。下表中展示了可以用於Like 運算子的通配符,以及與它們相符的數字和字串。
pattern 中的字元expression 中的匹配項
? 或_(底線) 任何單一字符
* 或% 零個或多個字符
# 任何單一數字(0— 9)
[charlist] 在charlist 中的任何單一字元。
[!charlist] 不在charlist 中的任何單一字元。
可以使用一組由中括號([]) 括住的一個或多個字符(charlist)來匹配在expression 中的任何單個字符,並且charlist 可以包含大部分ANSI 字符集中的字符,包括數字在內。可以透過將特定字元如左方括號([)、問號(?)、數字號(#) 和星號(*) 包含於方括號內來直接與這些符號本身進行配對。不能將右方括號用在一個群組中以匹配它自身,但可以將它作為單一字元用於群組外。
除了括在方括號中的簡單字元清單外,charlist 可以透過使用連字符號(-) 來分隔範圍的上界和下界。例如,在pattern 中使用[AZ] 時,如果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 字元範圍。
指定了一個字元範圍時,字元必須以升序排列出現(AZ 或0-100)。 [AZ] 是有效的模式,[ZA] 是無效模式。
忽略字元順序[ ];它被視為一個零長度字元()。
參考網址: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 等)。
[ ] 指定範圍([af]) 或集合([abcdef]) 中的任何單一字元。 Where au_lname LIKE '[CP]arsen' 將尋找以arsen 結尾且以介於C 與P 之間的任何單一字元開始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不屬於指定範圍([af]) 或集合([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 '%'