Использование логического "ИЛИ" в секции "ГДЕ" запроса
В основном условии оператор ИЛИ можно использовать только для последнего из используемых или единственного поля индекса, когда оператор ИЛИ можно заменить на оператор В:
Правильно:
ГДЕ
Таблица.Поле = &Значение1
ИЛИ Таблица.Поле = &Значение2
т.к. можно переписать при помощи оператора В (специально переписывать не нужно, можно оставить, как есть):
ГДЕ
Таблица.Поле В (&Значения)
Неправильно:
ГДЕ
Таблица.Поле1 = &Значение1
ИЛИ Таблица.Поле2 = &Значение2
В остальных случаях не следует использовать ИЛИ
в секции ГДЕ
запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероятность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты.
Например, запрос
ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001" ИЛИ Наименование = "Шкаф"
следует заменить на запрос:
ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001"
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Наименование = "Шкаф"
Эта рекомендация не распространяется на случаи, когда поле технически не может быть включено в состав индекса. Например, это поля вложенных запросов, поля виртуальных таблиц регистров и пр.
См. также
Экранирование кода
// sonar:UsingLogicalOrInWhere:off
// sonar:UsingLogicalOrInWhere:on