2016-01-07 48 views
4

我要寻找包含此字符串[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[]]%' 

回答

2

伟大的问题! Instictly感觉就像%[[]文本[]%应该下定决心:

ANYTHING【正文】ANYTHING

但它没有。因为]与[不开始模式搜索不同,它不需要转义]。改用%[[] text]%。

有关更多详细信息,请参阅MSDN Like页面上的“在通配符中使用通配符”一节。

+0

好的 - 谢谢 - 但即使]不开始模式搜索(所以已经是一个文字?)在方括号周围是什么伤害?!这个正则表达式'hello'不等于'hel [l] o'吗? – whytheq

+1

我真的想添加一个巧妙的段落来回答这个问题,但尽管我尽了最大的努力,但我无法弄清楚。我的问题不是我不确定自己的意思是什么[]。 LIKE'%[]%'不匹配任何内容(来自您的示例记录或空字符串)。我怀疑[]]用[]]解决了[]]。 []部分防止任何匹配。 –

+0

我认为@ t-clausen.dk的答案解决了这个问题。他声称[]要求SQL不匹配,这当然是不能完成的。 –

4

您应该只逃出开始支架这样的:

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

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

编辑:

一旦你把 '[]',在希望找到一个字符,什么都不匹配'[xy]]'会要求列表中的字符('x'或'y')位于该位置,'[]]'会导致空字符列表处于该位置,从而无法匹配。

+0

谢谢 - 你有没有我的参考资料,所以我可以读到正在发生的事情 - 这真的是违反直觉! – whytheq

+2

检查@目的地数据的一个好链接的答案 –

+0

(希望你不介意 - 你首先得到答案,但他需要的点,并给出了一个很好的解释) – whytheq