Как я могу избежать квадратных скобок в предложении LIKE? - PullRequest
207 голосов
/ 13 января 2009

Я пытаюсь фильтровать элементы с помощью хранимой процедуры, используя подобное. Колонна - это вархар (15). Элементы, которые я пытаюсь отфильтровать, имеют квадратные скобки в названии.

Например: WC[R]S123456.

Если я сделаю LIKE 'WC[R]S123456', он ничего не вернет.

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

Ответы [ 9 ]

288 голосов
/ 13 января 2009
LIKE 'WC[[]R]S123456' 

или

LIKE 'WC\[R]S123456' ESCAPE '\'

Должно работать.

104 голосов
/ 18 января 2011

Допустим, вы хотите сопоставить литерал its[brac]et.

Вам не нужно экранировать ], поскольку он имеет особое значение, только когда он связан с [.

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

27 голосов
/ 01 мая 2009

Мне нужно было исключить имена, начинающиеся с подчеркивания, из запроса, поэтому я получил следующее:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
18 голосов
/ 13 января 2009

Вот что я на самом деле использовал:

like 'WC![R]S123456' ESCAPE '!'
10 голосов
/ 13 января 2009

Ключевое слово ESCAPE используется, если вам нужно искать специальные символы, такие как% и _, которые обычно являются шаблонами Если вы укажете ESCAPE, SQL будет искать буквально символы% и _.

Вот хорошая статья с еще несколькими примерами

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
3 голосов
/ 12 октября 2017

Согласно документации :

В качестве литерала можно использовать символы подстановки, соответствующие шаблону персонажи. Чтобы использовать подстановочный знак в качестве литерального символа, заключите подстановочный знак в скобки.

Вам нужно экранировать эти три символа %_[:

'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
2 голосов
/ 09 февраля 2017

Если вам необходимо экранировать специальные символы, такие как '_' (подчеркивание), как это было в моем случае, и вы не хотите / не можете определить предложение ESCAPE, вы можете захотеть заключите специальный символ в квадратные скобки '[' и ']' .

Это объясняет значение "странной" строки '[[]' - она ​​просто охватывает символ '[' в квадратных скобках, эффективно экранируя его.

Мой вариант использования состоял в том, чтобы указать имя хранимой процедуры с подчеркиванием в ней в качестве критерия фильтра для Профилировщика. Поэтому я поместил строку '% name [_] из [_] a [_] хранимой [_] процедуры%' в поле TextData LIKE, и он дал мне результаты трассировки, которых я хотел достичь. 1017 *

Вот хороший пример из документации: LIKE (Transact-SQL) - использование подстановочных знаков в качестве литералов

1 голос
/ 30 января 2013

Вместо '\' или другого символа на клавиатуре вы также можете использовать специальные символы, которых нет на клавиатуре. В зависимости от вашего варианта использования это может быть необходимо, если вы не хотите, чтобы пользовательский ввод случайно использовался как escape-символ.

0 голосов
/ 11 июня 2018

Использовать подписку.

Чтобы пользовательский ввод выполнялся как есть, используйте escape, так как он потребует следующей замены всех специальных символов (ниже охватывает все SQL Server).

Здесь одинарная кавычка "'" не берется, поскольку она не влияет на подобное предложение, поскольку это вопрос конкатенации строк.

"-" & "^" & "]" замена не требуется, поскольку мы экранируем "[".

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

Тогда в SQL Query это должно быть следующим. (В параметризованном запросе строка может быть добавлена ​​с шаблонами после замены выше).

Для поиска точной строки.

like 'FormattedString' ESCAPE 'ð'

Для поиска начните со строки

like '%FormattedString' ESCAPE 'ð'

Поиск заканчивается строкой

like 'FormattedString%' ESCAPE 'ð'

Для поиска содержать строку

like '%FormattedString%' ESCAPE 'ð'

и т. Д. Для сопоставления с другим шаблоном. Но прямой ввод пользователя необходимо отформатировать, как указано выше.

...