#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.¶
Сравнение выполняется без учета регистра символов.