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

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

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

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

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


person Travis    schedule 13.01.2009    source источник


Ответы (10)


LIKE 'WC[[]R]S123456' 

or

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

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

person Otávio Décio    schedule 13.01.2009
comment
Ключевое слово ESCAPE требуется, если вы хотите использовать собственный escape-символ (обратная косая черта действительно является пользовательской). - person Ryan Kohn; 30.10.2012
comment
Я исправил и другую часть ответа. SQL Fiddle с версиями до и после - person Martin Smith; 01.11.2012
comment
обратите внимание, если вы хотите найти открытую, а затем закрывающую скобку, [[] []] не будет работать, вы должны использовать метод ESCAPE '\'. - person user420667; 22.10.2016
comment
Если кому-то неясно, почему нужно экранировать скобки, документация для LIKE указывает, что он используется для сопоставления одного символа в диапазоне или наборе. Например, использование LIKE '[fz]oo' будет соответствовать как 'foo', так и 'zoo'. - person Holistic Developer; 01.02.2017
comment
Было бы неплохо иметь обоснование для обоих из них в ответе. Мне было не сразу понятно, почему первый пример будет работать, пока я не прочитал ответ от Амитеш ниже. - person Don Jewett; 04.01.2019
comment
Предпочтите LIKE 'WC\[R]S123456' ESCAPE '\', так как он более удобочитаем для обслуживания. - person Fire Druid; 05.12.2019
comment
Я обнаружил, что некоторые версии SQL или варианты не позволяют использовать ключевое слово ESCAPE, а другие не допускают выбора [*]. Мне пришлось использовать оба в моем коде. - person Marius; 04.11.2020

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

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

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

person Amitesh    schedule 18.01.2011
comment
Это было действительно полезно и имхо лучший ответ. - person Jared Sol; 18.06.2015
comment
[[] выглядит странно, но имеет смысл, если посмотреть на него с точки зрения парсера. Парсер имеет особое правило обработки символов между [ ]. Итак, текст its[brac]et означает: Найти следующие последовательные строки: its, (применить правило для квадратных скобок: brac), et. С другой стороны, its[[]brac]et означает: Найти следующие последовательные строки: its, (применить правило для квадратных скобок: [), brac]et. - person Brian; 25.05.2018

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

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
person Andrew Backer    schedule 30.04.2009
comment
Мне пришлось использовать эту версию (явно указав escape-символ) - другие ответы здесь не дали мне правильных результатов. - person MarcE; 03.05.2012

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

like 'WC![R]S123456' ESCAPE '!'
person Travis    schedule 13.01.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 '\'
person scottm    schedule 13.01.2009

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

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

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

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

person ssurba    schedule 09.02.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
person Salman A    schedule 12.10.2017

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

person Rob Breidecker    schedule 30.01.2013
comment
Я часто использую ¬ - это все еще символ клавиатуры в Великобритании, но редко используется осознанно :) (вверху слева между Esc и Tab ) - person Andi Mohr; 09.12.2015
comment
Пользователи по-прежнему могут отправлять данные, содержащие буквы, которых нет на клавиатуре. Этот ответ звучит подозрительно, как предложение избежать фактического решения проблемы… - person binki; 11.04.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 'ð'

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

person Anonymous Creator    schedule 11.06.2018

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

LIKE 'WC[[]R]S123456' 

и:

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

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

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

person questaware    schedule 05.12.2019