[TSQL] SQL 查詢資料內有 % 逸出字元 的處理方法
針對這個問題可以先想像資料列有
3000 測次! aaa key 0
3001 測[次 aaa key 0
3002 測次% aaa key 0
3003 測%次 aaa key 0
3004 %測次 aaa key 0
當想要找出 % 的資料的時候
下這樣的語法時,希望 字首 或 字尾 有 % 都顯示出來
SELECT * FROM element WHERE ElementName like '%%%'
但實際使用後,卻是顯示全部的資料
為什麼呢 因為裡面的 % 還是被當作萬用字元查出,所以比較簡單的方法就可以直接使用
SELECT * FROM element WHERE ElementName like '%[%]%'
把 % 用 [ ] 包起來,就會變成一般的字元 ,就能顯示出前後具有 % 的資料
3002 測次% aaa key 0
3003 測%次 aaa key 0
3004 %測次 aaa key 0
當然還有其他的作法可以使用 ESCAPE
SELECT * FROM element WHERE ElementName like '%@%%' ESCAPE '@'
ESCAPE 這個語句在SQL線上叢書的解釋
含 ESCAPE 子句的模式比對
您可以搜尋包括一或多個特殊萬用字元的字元字串。例如,customers 資料庫中的 discounts 資料表可能會儲存包括百分比符號 (%) 的折扣值。若要將百分比符號當作字元而不是萬用字元來搜尋,您必須提供 ESCAPE 關鍵字和逸出字元。例如,包含名稱為 comment 的資料行且資料行中有 30% 這個文字的範例資料庫。若要搜尋 comment 資料行的任何位置含有 30% 這個字串的任何資料列,請指定 WHERE 子句,例如 WHERE comment LIKE '%30!%%' ESCAPE '!'
。如果未指定 ESCAPE 和逸出字元,Database Engine 會傳回任何含有 30 這個字串的資料列。
如果 LIKE 模式中逸出字元之後沒有任何字元,模式便無效,LIKE 會傳回 FALSE。如果逸出字元之後的字元不是萬用字元,就會捨棄萬用字元,且會將模式中在逸出之後的字元當作正規字元來處理。其中包括用一組方括號 ([ ]) 括住的百分比符號 (%)、底線 (_) 和左方括號 ([) 萬用字元。另外,在一組方括號字元 ([ ]) 內,您可以使用逸出字元,且可以逸出脫字符號 (^)、連字號 (-) 和右方括號 (])。
解單的解是就是按照剛剛至這段語句
SELECT * FROM element WHERE ElementName like '%@%%' ESCAPE '@'
第一個 % 開頭 任何字
第三個 % 結尾 任何字
所以前面你不管是用 @ ! # $ ^ & 都可以 主要是要用後面的 ESCAPE '@' 去換掉他 他就會變成 '%' 的 非命令字元轉回資料
這樣就允許在字元字串中搜尋萬用字元,萬用字元不提供萬用字元的功能。escape_character 是放在萬用字元前面,用來表示這個特殊用法的字元
這樣就能夠找到資料中的%及相關的關鍵字,當然還有許多透殊的用法,可以參考這篇線上叢書的介紹
http://technet.microsoft.com/zh-tw/library/ms173545.aspx
延伸一個有趣的
使用萬用字元作為常值
您可以使用萬用字元模式比對字元作為常值字元。若要使用萬用字元作為常值字元,請用括號將萬用字元括住。下表顯示若干使用 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