Sql server 如何在LIKE子句中转义方括号?
我正在尝试使用like使用存储过程筛选项目。该列是一个varchar(15)。我试图筛选的项目名称中有方括号 例如:Sql server 如何在LIKE子句中转义方括号?,sql-server,tsql,escaping,character,sql-like,Sql Server,Tsql,Escaping,Character,Sql Like,我正在尝试使用like使用存储过程筛选项目。该列是一个varchar(15)。我试图筛选的项目名称中有方括号 例如:WC[R]S123456 如果我执行类似“WC[R]S123456”的,它将不会返回任何内容 我找到了一些关于将ESCAPE关键字与LIKE一起使用的信息,但我不知道如何使用它将方括号视为常规字符串 LIKE 'WC[[]R]S123456' 或 应该有用。以下是我实际使用的: like 'WC![R]S123456' ESCAPE '!' 如果需要搜索特殊字符,如%和_,通
WC[R]S123456
如果我执行类似“WC[R]S123456”的,它将不会返回任何内容
我找到了一些关于将ESCAPE
关键字与LIKE
一起使用的信息,但我不知道如何使用它将方括号视为常规字符串
LIKE 'WC[[]R]S123456'
或
应该有用。以下是我实际使用的:
like 'WC![R]S123456' ESCAPE '!'
如果需要搜索特殊字符,如%和_,通常是通配符,则使用转义关键字。如果您指定转义,SQL将逐字搜索字符%和x
我需要从查询中排除以下划线开头的名称,因此我最终得出以下结论:
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character
假设您希望匹配文本及其[brac]et
您不需要转义]
,因为只有当它与[
配对时,它才具有特殊意义
因此,转义[
就足以解决问题。您可以将[
替换为[]
您也可以使用键盘上没有的特殊字符,而不是“\”或其他字符。如果您不希望用户输入被意外地用作转义字符,根据您的使用情况,这可能是必要的。如果您需要转义特殊字符,如'(下划线),与我的情况一样,您不愿意/无法定义转义子句,您可能希望用方括号'['和'].将特殊字符括起来
这解释了“奇怪”字符串'[]'的含义-它只包含带有方括号的'['字符,有效地对其进行转义
我的用例是指定一个带有下划线的存储过程的名称,作为探查器的筛选条件。因此,我将字符串'%name[\]of[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以下是文档中的一个很好的示例:
根据:
您可以使用通配符模式匹配字符作为文本
字符。要将通配符用作文字字符,
将通配符括在括号中
您需要转义这三个字符%\u[
:
'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,因为它将要求以下替换所有特殊字符(下面介绍了所有SQL Server)
这里不使用单引号“”,因为它不影响like子句,因为它是字符串连接的问题
“-”&“^”&“]”替换不是必需的,因为我们正在转义“[”
然后,在SQL查询中,它应该如下所示(在参数化查询中,在上述替换之后,可以使用模式添加字符串)
搜索精确的字符串
like 'FormattedString' ESCAPE 'ð'
以字符串开始搜索
like '%FormattedString' ESCAPE 'ð'
like 'FormattedString%' ESCAPE 'ð'
like '%FormattedString%' ESCAPE 'ð'
以字符串结尾搜索
like '%FormattedString' ESCAPE 'ð'
like 'FormattedString%' ESCAPE 'ð'
like '%FormattedString%' ESCAPE 'ð'
用字符串搜索包含
like '%FormattedString' ESCAPE 'ð'
like 'FormattedString%' ESCAPE 'ð'
like '%FormattedString%' ESCAPE 'ð'
等进行其他模式匹配。但直接用户输入需要如上所述的格式。这其中存在一个问题:
LIKE 'WC[[]R]S123456'
以及:
两者都适用于SQL Server,但都不适用于Oracle
似乎没有ISO/IEC 9075方法来识别包含左大括号的图案。我必须使用此版本(明确指定“转义”字符)-此处的其他答案没有为我提供正确的结果。如果要使用自定义转义字符(反斜杠确实是自定义的),则需要使用转义关键字。我也更正了答案的另一部分。如果有人不清楚为什么需要转义括号,则表示它用于匹配某个范围或集合中的单个字符。例如,使用如“[fz]oo'
将同时匹配'foo'和'zoo'。在答案中找到这两个词的基本原理会很好。在我阅读下面Amitesh的答案之前,我并不清楚为什么第一个例子会起作用。更喜欢像'WC\[R]S123456“ESCAPE'\'
,因为它对于维护来说更具可读性。这确实很有帮助,而且是最好的答案。[[]
确实看起来很奇怪,但从解析器的角度看它是有意义的。解析器有一个关于如何处理[]
之间的字符的特定规则。因此,文本是它的[brac]et
表示:“查找以下连续字符串:its
,(对方括号应用规则:brac
),et
”。另一方面,its[[[]brac]et
表示:“查找以下连续字符串:its
,(对方括号应用规则:[/code>),brac]et
”。我经常使用,
-在英国它仍然是一个键盘字符,但很少在知情的情况下使用:)(位于Esc
和Tab
之间的左上角)用户仍然可以提交包含不在键盘上的字母的数据。这个答案听起来像是一个避免实际解决问题的建议…