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

我试图使用就像过滤带有存储过程的项目。列是varchar(15)。我试图过滤的项目名称中有方括号。

例如:WC[R]S123456

如果我执行LIKE 'WC[R]S123456',它将不会返回任何东西。

我找到了一些关于使用ESCAPE关键字与LIKE的信息,但我如何使用它来处理方括号作为常规字符串?

201540 次浏览
LIKE 'WC[[]R]S123456'

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

应该工作。

下面是我实际使用的:

like 'WC![R]S123456' ESCAPE '!'

如果需要搜索特殊字符,如%和_,则使用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 '\'

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

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

假设你想匹配字面量its[brac]et

你不需要转义],因为它只有在与[配对时才有特殊意义。

你可以转义[ 将其替换为 [[]

除了键盘上的“\”或其他字符外,还可以使用键盘上没有的特殊字符。根据您的用例,这可能是必要的,如果您不希望用户输入意外被用作转义字符。

如果你需要转义特殊字符,如“_”(下划线),就像我的例子一样,并且你不愿意/不能定义一个转义子句,你可能希望用方括号“(”“]”将特殊字符括起来。

这解释了“奇怪的”字符串“[[]”的含义——它只是包含了带有方括号的“(”字符,有效地转义了它。

我的用例是指定一个存储过程的名称,其中带有下划线,作为Profiler的筛选条件。所以我把字符串%的名字[_]的[_][_][_]存储过程%’在TextData LIKE字段,它给了我跟踪结果,我想实现。

下面是文档中的一个很好的例子: 像& # 40;transact - sql # 41;—使用通配符作为文字 < / p >

根据文档:

你可以使用通配符模式匹配字符作为文字 字符。要使用通配符作为文字字符,

.

.

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

'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

使用下面的方法。

对于要搜索的用户输入,使用转义,因为它将要求对所有特殊字符进行以下替换(下面涵盖了所有SQL Server)。

这里有一个单引号,",不接受,因为它不影响就像子句,因为它是一个字符串连接的问题。

“产生绯闻;,“^”;,“]”;替换是不需要的,因为我们正在逃避"["

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

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

搜索一个精确的字符串。

like 'FormattedString' ESCAPE 'ð'

搜索从字符串开始:

like '%FormattedString' ESCAPE 'ð'

搜索以字符串结尾:

like 'FormattedString%' ESCAPE 'ð'

搜索包含字符串:

like '%FormattedString%' ESCAPE 'ð'

等等,用于其他模式匹配。但是直接的用户输入需要如上所述进行格式化。

这段时间有个问题

LIKE 'WC[[]R]S123456'

而且

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

都适用于SQL Server,都不适用于甲骨文

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