#std726¶
Особенности использования в запросах оператора ПОДОБНО¶
1.¶
Оператор ПОДОБНО в тексте запроса используйте только
- с константным строковым литералом, например:
Реквизит ПОДОБНО "123%"
- с параметром запроса, например:
Реквизит ПОДОБНО &Шаблон
Не создавайте строку шаблона вычислениями или конкатенацией.
Неправильно
В стандарте не указано
PostgreSQL и Oracle Database:
Квадратные скобки […] в шаблоне работают как спецсимволы в строковом литерале, и не работают в выражении.
ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО &Шаблон + "%"
2.¶
Используйте такие шаблоны оператора ПОДОБНО, которые работают одинаково на всех поддерживаемых СУБД.
Допустимо:
- %(процент) – последовательность, содержащая любое количество произвольных символов;
- _(подчеркивание) – один произвольный символ.
Не работает в IBM DB2:
- […](в квадратных скобках один или несколько символов) – любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например- [a-z], означающие произвольный символ, входящий в диапазон, включая концы диапазона;
- [^…](в квадратных скобках значок отрицания, за которым следует один или несколько символов) – любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания.
Ограничение в MS SQL 2005:
- Длина строки шаблона не должна превышать 1024символа
3.¶
В шаблонах подобия используются спецсимволы _%[]^.
Шаблоны подобия могут формироваться динамически, по введенным данным пользователя.
В введенных пользователю данных могут использоваться спецсимволы, которые необходимо трактовать как данные пользователя. Для того, чтобы спецсимвол трактовался как обычный символ его необходимо экранировать.
Например
Пользователь вводит текст: Кефир 15% жирности.
Программа должны этот % трактовать как часть строки, а не как спецсимвол последовательности произвольных символов.
Ошибка
При работе на PostgreSQL можно встретить ошибку
ERROR:  invalid regular expression: invalid character range при выполнении запроса с некорректно собранным фрагментом содержащим [].
Для экранирования:
- выберите спецсимвол экранирования, например ~;
- установите спецсимвол перед символами операнда, например ~%. Чтобы экранировать выбранный спецсимвол, его необходимо задвоить, например~~.
- дополните шаблон ключевым словом СПЕЦСИМВОЛ.
Например
Для поиск по строке 100% 
Для поиск по строке Кефир 15% жирности 
Для поиск по строке Шуруп_10[21] медь~4% 
Установка параметров запроса с помощью Запрос.УстановитьПараметр() не экранирует спецсимволы шаблона подобия.
Для экранирования используйте функцию СформироватьСтрокуДляПоискаВЗапросе()
Например
Паттерн
Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт
    Результат = СтрокаПоиска;
    Результат = СтрЗаменить(Результат, "~", "~~");
    Результат = СтрЗаменить(Результат, "%", "~%");
    Результат = СтрЗаменить(Результат, "_", "~_");
    Результат = СтрЗаменить(Результат, "[", "~[");
    Результат = СтрЗаменить(Результат, "]", "~]");
    Результат = СтрЗаменить(Результат, "^", "~^"); 
    Возврат Результат;
КонецФункции
В 1С:БСП реализован в ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе().
4.¶
Сравнение выполняется без учета регистра символов.