Я ищу строки, содержащие эту строку [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[]]%'
4
whytheq 7 Янв 2016 в 14:04

2 ответа

Лучший ответ

Отличный вопрос! Немедленно кажется, что% [[] text []]% должен разрешить:

НИЧЕГО [текст] НИЧЕГО .

Но это не так. Поскольку], в отличие от [, не запускает поиск шаблона, его не нужно экранировать. Вместо этого используйте% [[] text]%.

Дополнительные сведения см. В разделе «Использование подстановочных знаков в качестве литералов» на странице Нравится MSDN страница.

2
David Rushton 7 Янв 2016 в 11:36

Вы должны избегать стартовой скобки только так:

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

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

РЕДАКТИРОВАТЬ:

Как только вы введете '[]]', лайк ожидает найти символ, который ничего не соответствует. '[xy]]' потребует, чтобы список символов ('x' или 'y') был в этой позиции, '[]]' приведет к пустому списку символов, который будет в этой позиции, что сделает сопоставление невозможным .

4
t-clausen.dk 7 Янв 2016 в 12:52