2013-11-21 62 views
5

如果檢查出LIKE運營商的定義,你會看到,有其描述如下命名ESCAPE可選參數:爲什麼LIKE運算符有ESCAPE參數?

是放在一個通配符前面 字符表明通配符應該被解釋爲常規的 字符而不是通配符。 escape_character是一個字符 表達式,它沒有默認值並且只能計算一個 字符。

所以,當你寫一個WHERE條款類似如下,你告訴SQL Server引擎對待感嘆號作爲轉義字符(就像在C#中的'\'字符)列出的意見,其中包括'30%」子串:

WHERE comment LIKE '%30!%%' ESCAPE '!' 

現在這裏讓我感到困惑。通過將通配符放入方括號內已可以將其轉義。爲什麼要引入ESCAPE參數?這是有原因,我猜。

編輯:我看到幾個解釋ESCAPE如何工作的答案。我知道ESCAPE用於轉義通配符,但我也知道可以使用方括號轉義這些通配符。我只想了解「ESCAPE方法」具有什麼,「方括號方法」沒有。

編輯2:雖然Szymon的例子是完全有效的,但我不認爲這是ESCAPE被引入的唯一原因。我當然可能是錯的,但我懷疑可能有一些基於表現的原因,我不知道。 Szymon,您可以實現如下相同:

DECLARE @TEST_STRING VARCHAR(100) = 'ddd]eee'; 
SELECT 'MATCHED! (Szymon)' WHERE @TEST_STRING LIKE '%[abc!]]%' ESCAPE '!'; 
SELECT 'MATCHED! (Altern)' WHERE @TEST_STRING LIKE '%[abc]%' OR @TEST_STRING LIKE '%]%'; 

作爲一個附註,您不需要轉義左方括號字符。

+0

它應該*不*被視爲通配符的引擎? (順便說一句:這不是SQL Server特定的 - 它是由SQL標準定義的) –

+1

@a_horse_with_no_name:'[_]'和'[%]'分別。 – Heinzi

+0

@anario我的回答是你在找什麼? – Szymon

回答

3

它解釋位進一步,我想

此外,雙括號字符內([]),轉義字符可用於和插入符號(^),連字符( - ),和右括號(])可以被轉義。

比方說,你想搜索的任何包含的字符abc]

由於一組字符的方括號括起來[ ],你必須逃脫右括號,使之成爲集之一:

like '%[abc!]]%' escape '!' 

此外,如在評論中指出的那樣,使用方括號轉義的語法[ ]是非標準功能,而ESCAPE已記錄。

+0

對不起,刪除並再次打開此答案,但我的第一次嘗試是不正確的。爲此提出一個例子並不容易。 – Szymon

+1

你選擇一個很好的例子:) –

+0

@Szymon,我編輯了這個問題,並在那裏提到你。 –

0

Escape有可能在字符串匹配上下文和[]上下文中轉義字符。

LIKE '%[1-5!%]%' ESCAPE '!' 

這將匹配 '1' 或 '1%' 或 '4' 或 '4%',而不是6也不6%

+0

在這種情況下,您總是可以使用'[%]'。 – Szymon

+1

是的,但它們有不同的含義。 []用於指定可能值的範圍,而轉義則用於像HTML或URL一樣的轉義。但是,是的,你是對的,它可以像那樣使用,但並不意味着只是SQL Server的設計者。也許越獄有更好的表現,我不知道,但很有可能:) – evhen14

+0

是的,也許這是濫用[],但它仍然有效... – Szymon

1

沒有人從我讀提到這一點,但如果你還想查詢包含文字'[]'的文本,你將被迫轉義字符。因此,假設您想查詢包含文字字符'abc []'的字符串。我相信你會被迫修建這樣的查詢:

SELECT 'MATCHED! (Szymon)' WHERE @TEST_STRING LIKE '%[abc![!]]%' ESCAPE '!'; 

下面是關於這個問題的另一個鏈接:你如何尋找一個下劃線或百分號,如果你不能告訴 How can I escape square brackets in a LIKE clause?