为什么LIKE运算符有ESCAPE参数?

时间:2013-11-21 10:59:44

标签: sql-server sql-like

如果查看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 '%]%';

作为旁注,您不需要转义结束的方括号字符。

3 个答案:

答案 0 :(得分:3)

我想更进一步解释

  

此外,在双括号字符([])中,可以使用转义字符,并且可以转义插入符号(^),连字符( - )和右括号(])。

假设您要搜索包含字符abc]的任何内容。

由于括号[ ]中包含一组字符,因此您必须转义右括号以使其成为集合中的一个:

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

此外,正如评论中所指出的,使用方括号[ ]进行转义的语法是非标准功能,而ESCAPE则会记录。

答案 1 :(得分:1)

没有人从我读过的内容中提到这一点,但如果您还想查询包含文字' []'你被迫逃脱角色。所以,让我们说你想查询包含文字字符的字符串' abc []'。我相信你会被迫构建这样的查询:

\a 

以下是该主题的另一个链接: How can I escape square brackets in a LIKE clause?

答案 2 :(得分:0)

Escape可以在字符串匹配上下文和[]上下文中转义字符。

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

这将匹配'1'或'1%'或'4'或'4%',但不是6或6%