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

237

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

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

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

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

Travis
источник

Ответы:

329
LIKE 'WC[[]R]S123456' 

или

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

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

Otávio Décio
источник
10
Ключевое слово ESCAPE требуется, если вы хотите использовать пользовательский управляющий символ (обратная косая черта действительно является пользовательской).
Райан Кон
2
Я исправил и другую часть ответа. SQL Fiddle с версиями до и после
Мартин Смит,
10
Если кому-то непонятно, почему необходимо избегать скобок, в документации для LIKE указывается, что он используется для сопоставления с одним символом в диапазоне или наборе. Например, использование LIKE '[fz]oo'будет соответствовать как 'Foo' и 'Zoo'.
Целостный разработчик
3
Было бы хорошо иметь обоснование для обоих из них в ответе. Мне не сразу было понятно, почему первый пример сработает, пока я не прочитаю ответ Амитеша ниже.
Дон
1
Предпочитают, так LIKE 'WC\[R]S123456' ESCAPE '\'как это более читабельно для обслуживания.
Огненный друид
119

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

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

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

Amitesh
источник
7
Это было действительно полезно, и имхо лучший ответ.
Джаред Сол
1
[[]выглядит странно, но это имеет смысл, когда вы смотрите на это с точки зрения парсера. У парсера есть определенное правило для обработки символов между ними [ ]. Таким образом, текст its[brac]etозначает: «Найти следующие последовательные строки:, its(применить правило для квадратных скобок:) brac, et» . С другой стороны, its[[]brac]etозначает: «Найти следующие последовательные строки:, its(применить правило для квадратных скобок:) [, brac]et» .
Брайан
28

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

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Эндрю Бакер
источник
2
Мне пришлось использовать эту версию (явно указав «escape») - другие ответы здесь не дали правильных результатов для меня.
марта
20

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

like 'WC![R]S123456' ESCAPE '!'
Travis
источник
15

Ключевое слово 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 '\'
scottm
источник
6

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

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

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

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

ssurba
источник
4

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

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

Вам нужно убежать от этих трех персонажей %_[:

'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
Салман А
источник
1

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

Роб Брейдекер
источник
2
Я часто использую ¬- это все еще клавиатурный персонаж в Великобритании, но редко используется сознательно :) (вверху слева между Escи Tab)
Andi Mohr
Пользователи по-прежнему могут отправлять данные, содержащие буквы, которых нет на клавиатуре. Этот ответ звучит подозрительно, как предложение избежать реального решения проблемы ...
binki
0

Используйте следующее.

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

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

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

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

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

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

like 'FormattedString' ESCAPE 'ð'

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

like '%FormattedString' ESCAPE 'ð'

Чтобы поиск заканчивался строкой

like 'FormattedString%' ESCAPE 'ð'

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

like '%FormattedString%' ESCAPE 'ð'

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

Анонимный Создатель
источник
0

В этом есть проблема:

LIKE 'WC[[]R]S123456' 

и:

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

Оба работают для SQL Server, но ни один не работает для Oracle.

Похоже, что в ISO / IEC 9075 нет способа распознать шаблон с левой скобой.

questaware
источник