Как я могу избежать квадратных скобок в предложении LIKE?
Я пытаюсь фильтровать элементы с помощью хранимой процедуры, используя как. Колонна - это вархар (15). Пункты, которые я пытаюсь отфильтровать, имеют квадратные скобки в названии.
Например: WC[R]S123456
,
Если я сделаю LIKE 'WC[R]S123456'
это ничего не вернет.
Я нашел некоторую информацию об использовании ESCAPE
ключевое слово с LIKE
но я не понимаю, как использовать его, чтобы рассматривать квадратные скобки как обычную строку.
9 ответов
LIKE 'WC[[]R]S123456'
или же
LIKE 'WC\[R]S123456' ESCAPE '\'
Должно сработать.
Допустим, вы хотите соответствовать буквальному its[brac]et
,
Вам не нужно избегать ]
поскольку он имеет особое значение только тогда, когда он в паре с [
,
Поэтому избегая [
достаточно, чтобы решить проблему. Вы можете сбежать [
заменив его [[]
,
Мне нужно было исключить имена, начинающиеся со знака подчеркивания, из запроса, поэтому я получил следующее:
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character
Вот что я на самом деле использовал:
like 'WC![R]S123456' ESCAPE '!'
Ключевое слово 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 '\'
Согласно документации:
Вы можете использовать подстановочные знаки, соответствующие символам в качестве буквенных символов. Чтобы использовать подстановочный знак в качестве литерального символа, заключите подстановочный знак в скобки.
Вам нужно сбежать от этих трех персонажей %_[
:
'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
Если вам необходимо экранировать специальные символы, такие как '_' (подчеркивание), как это было в моем случае, и вы не хотите / не можете определить предложение ESCAPE, вы можете заключить специальный символ в квадратные скобки '[ ' и '] '.
Это объясняет значение "странной" строки '[[]' - она просто заключает символ '[' в квадратные скобки, эффективно экранируя его.
Мой вариант использования состоял в том, чтобы указать имя хранимой процедуры с подчеркиванием в ней в качестве критерия фильтра для Профилировщика. Поэтому я поместил строку '%name[_]of[_]a[_] хранимую [_] процедуру%' в поле TextData LIKE, и она дала мне результаты трассировки, которых я хотел достичь.
Вот хороший пример из документации: LIKE (Transact-SQL) - использование подстановочных знаков в качестве литералов
Проблема в том, что пока:
LIKE 'WC[[]R]S123456'
а также:
LIKE 'WC\[R]S123456' ESCAPE '\'
Оба работают для SQL Server, но ни один из них не работает для Oracle.
Похоже, что в ISO/IEC 9075 не существует способа распознать шаблон, содержащий левую скобку.
Вместо "\" или другого символа на клавиатуре вы также можете использовать специальные символы, которых нет на клавиатуре. В зависимости от вашего варианта использования это может быть необходимо, если вы не хотите, чтобы пользовательский ввод случайно использовался в качестве escape-символа.
Используйте следующее.
Чтобы пользовательский ввод выполнялся как есть, используйте escape, так как он потребует следующей замены всех специальных символов (ниже приведены все SQL Server).
Здесь одинарная кавычка "'" не берется, поскольку она не влияет на подобное предложение, поскольку речь идет о конкатенации строк.
"-" & "^" & "]" замена не требуется, поскольку мы экранируем "[".
String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");
Тогда в SQL Query это должно быть следующим. (В параметризованном запросе строка может быть добавлена с шаблонами после замены выше).
Для поиска точной строки.
like 'FormattedString' ESCAPE 'ð'
Для поиска начните со строки
like '%FormattedString' ESCAPE 'ð'
Чтобы поиск заканчивался строкой
like 'FormattedString%' ESCAPE 'ð'
Для поиска содержать со строкой
like '%FormattedString%' ESCAPE 'ð'
и так далее для другого сопоставления с образцом. Но прямой пользовательский ввод необходимо отформатировать, как указано выше.