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


236

我正在尝试使用存储过程来过滤项目。该列是varchar(15)。我要过滤的项目名称中带有方括号。

例如: WC[R]S123456

如果我这样做LIKE 'WC[R]S123456',将不会返回任何内容。

我发现了有关将ESCAPE关键字用于with的一些信息,LIKE但是我不明白如何使用它将方括号视为常规字符串。

Answers:


328
LIKE 'WC[[]R]S123456' 

要么

LIKE 'WC\[R]S123456' ESCAPE '\'

应该管用。


10
如果要使用自定义转义字符,则必须使用ESCAPE关键字(反斜杠确实是自定义的)。
瑞安·科恩

2
我也纠正了答案的另一部分。具有前后版本的SQL Fiddle
Martin Smith

10
如果不清楚为什么需要将方括号转义,LIKE文档会指出该方括号用于匹配范围或集合中的单个字符。例如,using LIKE '[fz]oo'将同时匹配'foo'和'zoo'。
整体开发人员

3
答案中有这两个方面的理由是很高兴的。在我从下面的Amitesh那里读到答案之前,对我来说,第一个示例为什么会起作用并不立刻显而易见。
Don Jewett

1
首选,LIKE 'WC\[R]S123456' ESCAPE '\'因为它对于维护更具可读性。
德鲁伊

119

假设您要匹配文字its[brac]et

您无需转义,]因为它只有与配对时才具有特殊含义[

因此,转义[就足以解决问题。您可以[ 通过将其替换为 来逃脱[[]


7
这确实很有帮助,而且imo是最佳答案。
Jared Sol

1
[[]确实看起来很奇怪,但是当您从解析器的角度来看它时,这是有道理的。解析器对于如何处理之间的字符有特定的规则[ ]。因此,该文本的its[brac]et意思是:“找到以下连续的字符串:its,(将规则应用于方括号:)bracet。另一方面,its[[]brac]et表示:“查找以下连续的字符串:its,([brac]et对方括号应用规则:)
布莱恩

28

我需要从查询中排除以下划线开头的名称,因此我得出了以下结论:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

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


15

如果需要搜索特殊字符(例如%和_,通常是通配符),则使用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 '\'

6

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

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

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

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


4

根据文件

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

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

'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

1

除了键盘上的'\'或其他字符外,您还可以使用键盘上没有的特殊字符。如果您不希望用户输入意外地用作转义字符,则可能需要根据您的用例进行此操作。


2
我经常使用¬-在英国,它仍然是键盘字符,但很少有意使用:)(介于EscTab
Andi Mohr 2015年

用户仍然可以提交键盘上未包含字母的数据。这个答案听起来可疑,像是一个建议,以避免实际解决问题……
binki 18-4-11

0

使用跟随。

为了使用户输入能够按原样搜索,请使用转义,因为它将需要以下所有特殊字符的替换(下面涵盖了所有SQL Server)。

这里不使用单引号“'”,因为它不会影响like子句,因为这是字符串连接的问题。

由于我们要转义“ [”,因此不需要“-”和“ ^”和“]”替换。

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

然后,在SQL Query中应如下所示。(在参数化查询中,可以在上述替换之后在字符串中添加模式)。

搜索确切的字符串。

like 'FormattedString' ESCAPE 'ð'

搜索以字符串开头

like '%FormattedString' ESCAPE 'ð'

搜索以字符串结尾

like 'FormattedString%' ESCAPE 'ð'

搜索包含字符串

like '%FormattedString%' ESCAPE 'ð'

以便进行其他模式匹配。但是直接用户输入需要如上所述设置格式。


0

同时存在一个问题:

LIKE 'WC[[]R]S123456' 

和:

LIKE 'WC\[R]S123456' ESCAPE '\'

两者都适用于SQL Server,但都不适用于Oracle。

似乎没有ISO / IEC 9075方法来识别涉及左括号的模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.