Как я могу выполнить SQL SELECT с условием LIKE для строки, содержащей символ открытой скобки?

У меня есть простой поисковый запрос:

<cfquery name="_qSearch" dbtype="Query">
    SELECT 
        *
    FROM    MyQoQ
    WHERE
        DESCRIPTION LIKE '%#URL.searchString#%'
</cfquery>

Этот запрос отлично работает для большинства значений. Однако, если кто-то ищет такое значение, как "xxx[en", он выдает сообщение об ошибке The pattern of the LIKE conditional is malformed..

Есть ли способ обойти это, поскольку скобка используется в CFQUERY особым образом?


person Eric Belair    schedule 24.02.2014    source источник


Ответы (1)


QoQ разделяет функцию TSQL ( MS SQL Server), благодаря чему не только % и _ являются подстановочными знаками в LIKE, но и поддерживают классы символов в стиле регулярных выражений, как in[a-z] для любой строчной буквы.

Чтобы избежать этих значений и сопоставить литеральные эквиваленты, вы можете использовать сам класс символов, т.е. [[] будет соответствовать буквальному [, и, конечно, вы, вероятно, также захотите экранировать любые % и _ в пользовательском вводе - вы можете сделать все три, например так:

'%#Url.SearchString.replaceAll('[\[%_]','[$0]')#%'

Это просто замена регулярного выражения (с использованием String.replaceAll), чтобы сопоставить все экземпляры [ или % или _ и обернуть каждый из них в [..]$0 на замещающей стороне представляет совпавший текст.

person Peter Boughton    schedule 24.02.2014
comment
К вашему сведению, вы также можете указать escape-символ с помощью Условие ESCAPE - person Leigh; 25.02.2014
comment
Это не работает... Например, если я использую значение xxx[en], запрос выглядит так: SELECT * FROM MyQoQ WHERE DESCRIPTION LIKE '%xxx[[]en%', и никакие записи не возвращаются, хотя запрос непосредственно в базу данных (т.е. SELECT * FROM MyDBTable WHERE MyDBTable.DESCRIPTION LIKE '%xxx[en%' находит записи. - person Eric Belair; 27.02.2014
comment
Не уверен, что случилось - я специально проверил это, и это сработало, но у меня нет этого кода под рукой. Повторная попытка теперь работает для [%], но не для [[]. :/ - person Peter Boughton; 27.02.2014
comment
Если это исходит из базы данных, есть ли причина, по которой вы не просто запрашиваете это напрямую? - person Peter Boughton; 27.02.2014
comment
Только что попробовал предложение ESCAPE, о котором упоминал Ли, и это дает ошибку Invalid Escape Sequence. Допустимые пары последовательностей для этого escape-символа: /% или /._ — что неверно, поскольку я использовал обратную косую черту, а не прямую (и работает только обратная косая черта). Это на CF 10,0,11,285437, если это зависит от версии. - person Peter Boughton; 27.02.2014
comment
@PeterBoughton, да, это отлично работает для % и _, и я собираюсь реализовать это как можно скорее. Но я все еще не могу заставить [работать. - person Eric Belair; 27.02.2014
comment
@PeterBoughton, причина, по которой я не запрашиваю базу данных напрямую, заключается в том, что я кэширую данные в «основном» запросе и повторно использую их для нескольких разных запросов. - person Eric Belair; 27.02.2014
comment
Ребята - Странно. Я относительно уверен, что раньше использовал QoQ + ESCAPE. Хотя это было некоторое время назад. Я не могу проверить это сейчас, но проверю это позже. - person Leigh; 27.02.2014
comment
@Leigh, вот что я получаю в CF 8: синтаксическая ошибка Query Of Queries. Столкнулся с ПОБЕГОМ. ColdFusion не может определить строку шаблона, вызвавшую эту ошибку. Часто это вызвано ошибкой в ​​подсистеме обработки исключений. -------------------------------------------------- ------------------------------ SQL SELECT * FROM qSearchableMaterials WHERE 1 = 1 AND ( UCASEDESCRIPTION LIKE '%$[01%' ) ПОРЯДОК ПО РАНГУ ESCAPE '$' - person Eric Belair; 27.02.2014
comment
Либо внутренняя логика, либо документация здесь нарушены, потому что кажется, что ESCAPE только работает для экранирования % и _. Ничего больше. Используйте его для любых других символов, таких как [, и вы получите некоторые варианты ошибок, описанных выше. Фу.. - person Leigh; 28.02.2014
comment
Хорошо, определенно ошибка в CF. Мое описание wi[bb]le, и поиск %[[]bb]% ([bb]) работает, но только %[[]bb% ([bb) не дает результатов - CF, должно быть, делает что-то глупое с разбором QoQ SQL. v10,0,11,285437 - person Peter Boughton; 28.02.2014
comment
@PeterBoughton, похоже, нет никакого способа обойти это .... Я просто собираюсь удалить все открытые скобки из моих строк поиска на данный момент. Я бы предпочел, чтобы возвращалось больше результатов поиска, чем исключение. Спасибо. - person Eric Belair; 28.02.2014