如何在LIKE子句中转义方括号?

Tra*_*vis 222 t-sql sql-server escaping character sql-like

我正在尝试使用类似的过滤器使用存储过程过滤项目.该列是varchar(15).我想要过滤的项目在名称中有方括号.

例如: WC[R]S123456.

如果我这样做LIKE 'WC[R]S123456',它将不会返回任何东西.

我找到了一些关于使用ESCAPE关键字的信息,LIKE但我不明白如何使用它来将方括号视为常规字符串.

Otá*_*cio 310

LIKE 'WC[[]R]S123456' 
Run Code Online (Sandbox Code Playgroud)

要么

LIKE 'WC\[R]S123456' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)

应该管用.

  • 如果有人不清楚为什么需要转义括号,[LIKE]文档(https://msdn.microsoft.com/en-us/library/ms179859.aspx)表示它用于匹配单个字符在范围或集合中.例如,使用`LIKE'[fz] oo'`将匹配'foo'和'zoo'. (9认同)
  • 如果要使用自定义转义字符(反斜杠确实是自定义),则需要ESCAPE关键字. (7认同)
  • 在答案中为这两个理由提供理由会很好。在我阅读下面 Amitesh 的答案之前,我并不清楚为什么第一个例子会起作用。 (4认同)
  • 我也纠正了答案的另一部分.[SQL小提琴前后版本](http://www.sqlfiddle.com/#!3/d41d8/5633) (2认同)
  • 更喜欢“LIKE 'WC\[R]S123456' ESCAPE '\'”,因为它更易于维护。 (2认同)

小智 113

假设你想匹配文字its[brac]et.

你不需要逃脱]它,因为它只有在配对时具有特殊含义[.

因此逃避[就足以解决问题.您可以[ 通过替换它 来逃避[[].

  • 这真的很有帮助,也是最好的答案. (6认同)
  • `[[]` 确实看起来很奇怪,但是当你从解析器的角度来看它时,它是有道理的。解析器对于如何处理“[]”之间的字符有特定的规则。因此,文本 `its[brac]et` 的意思是:_“查找以下连续字符串:`its`,(应用方括号规则:`brac`),`et`”_。另一方面,`its[[]brac]et` 的意思是:_“查找以下连续字符串:`its`,(应用方括号规则:`[`)、`brac]et`”_。 (2认同)

And*_*ker 27

我需要从查询中排除以下划线开头的名称,所以我最终得到了这个:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Run Code Online (Sandbox Code Playgroud)

  • 我必须使用此版本(明确指定“转义”字符)-此处的其他答案没有为我提供正确的结果。 (2认同)

Tra*_*vis 18

这是我实际使用的:

like 'WC![R]S123456' ESCAPE '!'
Run Code Online (Sandbox Code Playgroud)


sco*_*ttm 13

如果您需要搜索%和_等特殊字符(通常是通配符),则使用ESCAPE关键字.如果指定ESCAPE,SQL将逐字搜索字符%和_.

这是一篇包含更多示例的好文章

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 7

根据文件

您可以使用通配符模式匹配字符作为文字字符。要将通配符用作文字字符,请将通配符括在方括号中。

您需要转义这三个字符%_[

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true
Run Code Online (Sandbox Code Playgroud)


ssu*_*rba 5

如果像我这样需要转义'_'(下划线)之类特殊字符,并且您不愿意/无法定义ESCAPE子句,则不妨将特殊字符括在方括号'[ '']'

这就解释了“怪异”字符串'[[]'的含义-它只是在方括号中包含'['字符,从而有效地将其转义。

我的用例是指定带有下划线的存储过程的名称,作为Profiler的过滤条件。因此,我将字符串'%name [_] of [_] a [_] stored [_] procedure%'放入了TextData LIKE字段中,它为我提供了想要实现的跟踪结果。

这是文档中的一个很好的示例: LIKE(Transact-SQL)-使用通配符作为文字