方括号按预期在表达式中运行

Square brackets functioning in expression as expected

我正在寻找包含此字符串的字符串 [management]

这是场景模型:

create table #test (st varchar(200))
insert into #test
values 
('hello'),
('hello management'),
('hello [management]'),
('hello [management] blah'),
('hello [management rev] blah');

select * from #test where st like '%\[management]%' ESCAPE '\'

上面找到了我所期望的,但为什么下面找不到相同的字符串?

select * from #test where st like '%[[]management[]]%'

您应该只像这样转义开始括号:

DECLARE @t table(x varchar(100))
INSERT @t 
SELECT '[management]'

SELECT * from @t where x like '%[[]management]%'

编辑:

一旦您输入“[]]”,like 期望找到一个不匹配的字符。 '[xy]]' 将要求字符列表('x' 或 'y')位于该位置,'[]]' 将导致该位置为空字符列表,让比赛变得不可能。

好问题!直觉上感觉 %[[]text[]]% 应该解析为:

任何东西[文本]任何东西

但事实并非如此。因为 ] 与 [ 不同,它不会启动模式搜索,因此不需要转义。请改用 %[[]text]%。

有关详细信息,请参阅 MSDN Like 页面上的 "Using Wildcard Characters As Literals" 部分。