Перейти к содержанию
#std726

Особенности использования в запросах оператора ПОДОБНО

1.

Оператор ПОДОБНО в тексте запроса используйте только

  • с константным строковым литералом, например: Реквизит ПОДОБНО "123%"
  • с параметром запроса, например: Реквизит ПОДОБНО &Шаблон

Не создавайте строку шаблона вычислениями или конкатенацией.

Неправильно

Реквизит ПОДОБНО "123" + "%"
Реквизит ПОДОБНО &Шаблон + "%"
Реквизит ПОДОБНО Таблица.Шаблон

Правильно

Реквизит ПОДОБНО "123%"
Реквизит ПОДОБНО &Шаблон

В стандарте не указано

PostgreSQL и Oracle Database:

Квадратные скобки [] в шаблоне работают как спецсимволы в строковом литерале, и не работают в выражении.

Cкобки имеют специальный смысл
ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО "123[АБ]%"
Cкобки в переменной &Шаблон это просто текст
ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО &Шаблон + "%"
Cкобки в переменной &Шаблон имеют специальный смысл
ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО &Шаблон
2.

Используйте такие шаблоны оператора ПОДОБНО, которые работают одинаково на всех поддерживаемых СУБД.

Допустимо:

  • % (процент) – последовательность, содержащая любое количество произвольных символов;
  • _ (подчеркивание) – один произвольный символ.

Не работает в IBM DB2:

  • [] (в квадратных скобках один или несколько символов) – любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например [a-z], означающие произвольный символ, входящий в диапазон, включая концы диапазона;
  • [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов) – любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания.

Ограничение в MS SQL 2005:

  • Длина строки шаблона не должна превышать 1024 символа
3.

В шаблонах подобия используются спецсимволы _%[]^. Шаблоны подобия могут формироваться динамически, по введенным данным пользователя. В введенных пользователю данных могут использоваться спецсимволы, которые необходимо трактовать как данные пользователя. Для того, чтобы спецсимвол трактовался как обычный символ его необходимо экранировать.

Например

Пользователь вводит текст: Кефир 15% жирности. Программа должны этот % трактовать как часть строки, а не как спецсимвол последовательности произвольных символов.

Ошибка

При работе на PostgreSQL можно встретить ошибку ERROR: invalid regular expression: invalid character range при выполнении запроса с некорректно собранным фрагментом содержащим [].

Для экранирования:

  • выберите спецсимвол экранирования, например ~;
  • установите спецсимвол перед символами операнда, например ~%. Чтобы экранировать выбранный спецсимвол, его необходимо задвоить, например ~~.
  • дополните шаблон ключевым словом СПЕЦСИМВОЛ.

Например

Для поиск по строке 100%

"100~%" СПЕЦСИМВОЛ "~"

Для поиск по строке Кефир 15% жирности

"Кефир 15~% жирности" СПЕЦСИМВОЛ "~"

Для поиск по строке Шуруп_10[21] медь~4%

"Шуруп~_10~[21~] медь~~4~%" СПЕЦСИМВОЛ "~"

Установка параметров запроса с помощью Запрос.УстановитьПараметр() не экранирует спецсимволы шаблона подобия.

Для экранирования используйте функцию СформироватьСтрокуДляПоискаВЗапросе()

Например

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка 
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ "~"
Запрос.УстановитьПараметр("Шаблон", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ИскомыйТекст) + "%");

Паттерн

Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт

    Результат = СтрокаПоиска;
    Результат = СтрЗаменить(Результат, "~", "~~");
    Результат = СтрЗаменить(Результат, "%", "~%");
    Результат = СтрЗаменить(Результат, "_", "~_");
    Результат = СтрЗаменить(Результат, "[", "~[");
    Результат = СтрЗаменить(Результат, "]", "~]");
    Результат = СтрЗаменить(Результат, "^", "~^"); 

    Возврат Результат;

КонецФункции

В 1С:БСП реализован в ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе().

4.

Сравнение выполняется без учета регистра символов.

Источник

https://its.1c.ru/db/v8std#content:726