[TSQL] SQL 查詢資料內有 % 逸出字元 的處理方法

[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