2013-09-09 4 views
30

У меня есть столбец имя адрес, который состоит из некоторого адреса, который имеет «%» между, как:Как найти «%» с помощью оператора LIKE в SQL Server?

Address 
-------------------- 
Aman Ja%lan% 
Stree% Ro%ad 

и т.д., и т.д.

Как я могу написать LIKE оператор, чтобы найти этот шаблон?

Я пробовал:

declare @var char(1) 
set @var='!%' 
select Address from Accomodation where Address like '%'[email protected]+'%' 

ответ

35

Я хотел бы использовать

WHERE columnName LIKE '%[%]%' 

статистика SQL сводного хранит Серверную строку для использования в оценивая количество строк, которые будут соответствовать предписанию LIKE. Оценки мощности могут быть лучше и привести к более подходящему плану, когда используется синтаксис квадратной скобки.

Ответ на this Connect Item заявляет

У нас нет поддержки для оценки точной мощности в присутствии определенных пользователем символов эвакуации. Поэтому мы, вероятно, получаем плохую оценку и плохой план. Мы рассмотрим этот вопрос в следующем выпуске .

Пример

CREATE TABLE T 
(
X VARCHAR(50), 
Y CHAR(3000) NULL 
) 

CREATE NONCLUSTERED INDEX IX ON T(X) 

INSERT INTO T (X) 
SELECT TOP (5) '10% off' 
FROM master..spt_values 
UNION ALL 
SELECT TOP (100000) 'blah' 
FROM master..spt_values v1, master..spt_values v2 


SET STATISTICS IO ON; 
SELECT * 
FROM T 
WHERE X LIKE '%[%]%' 

SELECT * 
FROM T 
WHERE X LIKE '%\%%' ESCAPE '\' 

показывает 457 логических операций чтения для первого запроса и 50,003 для второго.

+0

Действительно, martin, очень ясное объяснение, но как насчет случая, когда нужно искать ']' ??? Например 'INSERT INTO T (X) ВЫБРАТЬ TOP (5) '10 [] выкл ' ИЗ master..spt_values' –

+0

Действительно стрижа, очень ясное объяснение, но как в случае, когда один должен искать' ] '??? Например 'INSERT INTO T (X) ВЫБРАТЬ TOP (5) '10 [] выкл» ИЗ master..spt_values' Для этого, когда я пытаюсь искать с [], он не пришел 'SET STATISTICS IO ON; SELECT * FROM T WHERE X LIKE '% []]%' ' Но он работал с ниже одного ' SELECT * FROM T WHERE X LIKE '% \]%' ESCAPE '\' ' –

+1

@TejuMB - для этого не требуется экранирование. Просто используйте LIKE ''%]%''. Если вы делаете 'LIKE '% [AB]]%'', это означает совпадение символа в наборе 'A, B', затем'] '. Если вы делаете 'LIKE '% [A]]%'', это означает соответствие 'A ''. Если вы делаете 'LIKE '% []]%'', то это означает, что «соответствует одному символу в этом пустом наборе символов, за которым следует символ'] '. Поскольку набор пуст, символ не может совпадать. –

17

Вы можете использовать ESCAPE:

WHERE columnName LIKE '%\%%' ESCAPE '\' 
+0

Спасибо, на самом деле я удалил ESCAPE, поскольку я думал, что это может быть для моей справки. –

+3

Использование LIKE '% [%]%' должно также сделать трюк. – gotqn

+1

@ 491243 На самом деле, это довольно хорошая точка. Вы не можете избежать ']', как это '[]]', но вы можете избежать этого, используя ключевое слово ESCAPE и escape-символ. +1 для этого, и жаль, что ключевого слова ESCAPE для PATHINDEX тоже нет. – gotqn

2

Попробуйте это:

declare @var char(3) 
set @var='[%]' 
select Address from Accomodation where Address like '%'[email protected]+'%' 

Вы должны использовать [] отменяет действие шаблона, так что вы читали% как обычный символ, IDEM о характере _