我正在尝试使用like通过存储过程来过滤项目。该列是 varchar(15)。我尝试过滤的项目名称中带有方括号。
例如:
WC[R]S123456
。
如果我执行
LIKE 'WC[R]S123456'
,它不会返回任何内容。
我找到了一些有关将
ESCAPE
关键字与 LIKE
一起使用的信息,但是如何使用它来将方括号视为常规字符串?
LIKE 'WC[[]R]S123456'
或
LIKE 'WC\[R]S123456' ESCAPE '\'
应该可以。
假设您要匹配文字
its[brac]et
。
您不需要转义
]
,因为它只有与[
配对时才具有特殊含义。
因此转义
[
就足以解决问题。你可以通过将其替换为[
来转义[[]
。
我需要从查询中排除以下划线开头的名称,所以我最终得到了这个:
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character
这是我实际使用的:
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 '\'
根据文档:
您可以使用通配符模式匹配字符作为文字 人物。要将通配符用作文字字符, 将通配符括在括号中。
你需要转义这三个字符
%_[
:
'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
如果您需要转义像 '_'(下划线)这样的特殊字符(就像我的情况一样),并且您不愿意/无法定义 ESCAPE 子句,您可能希望用 square 将特殊字符括起来括号 '[' 和 ']'。
这解释了“奇怪”字符串 '[[]' 的含义 - 它只是包含带有方括号的 '[' 字符,有效地转义它。
我的用例是指定其中包含下划线的存储过程的名称作为探查器的过滤条件。因此,我将字符串 '%name[_]of[_]a[_]stored[_]procedure%' 放入 TextData LIKE 字段中,它给了我想要实现的跟踪结果。
这是文档中的一个很好的示例: LIKE (Transact-SQL) - 使用通配符作为文字
那段时间有问题
LIKE 'WC[[]R]S123456'
和
LIKE 'WC\[R]S123456' ESCAPE '\'
两者都适用于 SQL Server,但均不适用于 Oracle。
似乎没有任何 ISO/IEC 9075 方法来识别涉及左大括号的模式。
您还可以使用键盘上没有的特殊字符来代替“\”或键盘上的其他字符。如果您不希望用户输入意外地用作转义字符,这可能是必要的,具体取决于您的用例。
使用以下内容。
对于用户输入的搜索,请使用转义,因为它将需要对所有特殊字符进行以下替换(以下涵盖了 SQL Server 的所有内容)。
这里不使用单引号“'”,因为它不会影响 like 子句,因为它是字符串连接的问题。
不需要替换“-”和“^”和“]”,因为我们正在转义“[”。
String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");
然后,在 SQL 查询中应该如下所示。 (在参数化查询中,可以在上述替换后为字符串添加模式)。
搜索精确的字符串。
like 'FormattedString' ESCAPE 'ð'
要搜索以字符串开头:
like '%FormattedString' ESCAPE 'ð'
搜索以字符串结尾:
like 'FormattedString%' ESCAPE 'ð'
要搜索包含字符串:
like '%FormattedString%' ESCAPE 'ð'
其他模式匹配依此类推。但直接用户输入需要按照上面提到的进行格式化。