SQL查詢語句通配符與ACCESS模糊查詢like的解決方法
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
我今天在寫個頁面的時候,也很郁悶,表中明明有記錄,但在ASP里就是搜索不到,原來是因為access與SQL的查詢語句通配符問題不同所引起的。 ACCESS的通配符和SQL SERVER的通配符比較 =================================================== ACCESS庫的通配符為: * 與任何個數(shù)的字符匹配 ? 與任何單個字母的字符匹配 SQL Server中的通配符為: % 與任何個數(shù)的字符匹配 _ 與單個字符匹配 正文 我今天在寫個頁面的時候,也很郁悶,表中明明有記錄,但在ASP里就是搜索不到,理論的sql語句如下: Select * FROM t_food Where t_food.name like '*蘋果*' 去GOOGLE搜搜發(fā)現(xiàn),ASP中模糊查詢要這樣寫: Select * FROM t_food Where t_food.name like '%%蘋果%%' 必須是“%”,而且要兩個。大家多注意。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SQL查詢語句通配符問題 在Access中用SQL語句進行數(shù)據(jù)查詢時,用了通配符*進行查詢。語句如下: 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"),也可以使用通配符來查找某個范圍內(nèi)的值(例如 Like "Sm*")。 在表達式中,可以使用 Like 運算符來比較字段值與字符串。例如,如果在 SQL 查詢中輸入 Like "C*",那么該查詢將返回所有以字母 C 開頭的字段值。在參數(shù)查詢中,可以提示用戶鍵入要搜索的模式。 下面的示例返回以字母 P 開頭并且后面為 A 到 F 之間任何字母以及三個數(shù)字的數(shù)據(jù): 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 單個數(shù)字 a#a a0a, a1a, a2a aaa, a10a 字符范圍 [a-z] f, p, j 2, & 范圍之外 [!a-z] 9, &, % b, a 非數(shù)字值 [!0-9] A, a, &, ~ 0, 1, 9 復合值 a[!b-m]# An9, az0, a99 abc, aj0 /////////////////////////////////////////////////////////// 幫助都這么寫了,沒有任何問題啊,到底問題是出在哪里呢?更加讓本人迷惑。后來問了一下同事說:你的SQL語句錯了,通配符應該用%,而不是*??墒菐椭锩嬲f的是*,而且我在Access中試驗一切正常,同事也說不上個所以然來,于是繼續(xù)查找?guī)椭枨蟠鸢?。在另一個幫助文件中找到了如下信息: /////////////////////////////////////////////////////////// 內(nèi)置的模式匹配方法提供了一個用于字符串比較的通用工具。下表中展示了可以用于 Like 運算符的通配符,以及與它們匹配的數(shù)字和字符串。 pattern 中的字符expression 中的匹配項 ? 或 _(下劃線) 任何單個字符 * 或 % 零個或多個字符 # 任何單個數(shù)字 (0— 9) [charlist] 在 charlist 中的任何單個字符。 [!charlist] 不在 charlist 中的任何單個字符。 可以使用一組由中括號 ([]) 括住的一個或多個字符(charlist)來匹配在 expression 中的任何單個字符,并且 charlist 可以包含大部分 ANSI 字符集中的字符,包括數(shù)字在內(nèi)??梢酝ㄟ^將特定字符如左方括號 ([)、問號 (?)、數(shù)字號 (#) 和星號 (*) 包含于方括號內(nèi)來直接與這些符號自身進行匹配。不能將右方括號用在一個組中以匹配它自身,但可以將它作為單個字符用于組外。 除了括在方括號中的簡單字符列表外,charlist 可以通過使用連字符號 (-) 來分隔范圍的上界和下界。例如,在 pattern 中使用 [A-Z] 時,如果 expression 中相應的字符包含了任何在 A 到 Z 范圍之間的大寫字符,就能實現(xiàn)匹配??梢栽诜嚼ㄌ栔邪鄠€范圍而不必為范圍劃界。例如,[a-zA-Z0-9] 可以匹配任何字母數(shù)字字符。 請注意,ANSI SQL 通配符 (%) 和 (_) 僅在 Microsoft? Jet 4.X 版本和 Microsoft OLE DB Provider for Jet 中才是有效的。如果用在 Microsoft Access 或 DAO 中,那么它們被視為文本。 其他重要的用于模式匹配的規(guī)則如下所示: 在 charlist 的開頭使用感嘆號 (!) 將表示如果在 charlist 以外的任何字符出現(xiàn)在 expression 中,則發(fā)生匹配。當它用在方括號的外面時,感嘆號匹配它自身。 可以將連字符號 (-) 用于 charlist 的開頭(感嘆號之后)或末尾以匹配它自身。在其他任何位置中,連字符號標識一個 ANSI 字符范圍。 指定了一個字符范圍時,字符必須以升序排列出現(xiàn)(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 數(shù)據(jù)庫中的 discounts 表可能存儲含百分號 (%) 的折扣值。若要搜索作為字符而不是通配符的百分號,必須提供 ESCAPE 關鍵字和轉義符。例如,一個樣本數(shù)據(jù)庫包含名為 comment 的列,該列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,請指定由 Where comment LIKE '%30!%%' ESCAPE '!' 組成的 Where 子句。如果不指定 ESCAPE 和轉義符,SQL Server 將返回所有含字符串 30 的行。 下例說明如何在 pubs 數(shù)據(jù)庫 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 '%'
該文章在 2012/2/17 15:26:48 編輯過 |
關鍵字查詢
相關文章
正在查詢... |