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

Отсутствие проверки на NULL или приведения через ЕстьNULL при левых/правых соединениях

При использовании левых или правых (внешних) соединений поля из присоединяемых таблиц могут принимать значение NULL. А все выражения с NULL и сравнения с NULL в запросах приводят также к NULL.

При использовании подобных полей в выражениях нужно учитывать возможность появления NULL.

Пример запроса

ВЫБРАТЬ
  Товары.Наименование,
  Цены.Цена
ИЗ
  Справочник.Товары КАК Товары
    ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК Цены
    ПО Товары.Ссылка = Цены.Товар

В запросе поле "Цена" может принимать значение NULL. И придется учитывать этот момент в своем коде 1С или последующих запросах, что добавляет сложности в разработке.

Для упрощения возможно применить несколько вариантов

  1. Используйте приведение через ЕстьNULL(Поле, ЗаменяющееЗначение). Например, ЕстьNULL(Цены.Цена, 0)

  2. Используйте проверку "ЕСТЬ NULL". Например, ВЫБОР КОГДА Цены.Цена ЕСТЬ NULL Тогда 0 Иначе Цены.Цена

Это искусственный пример. В данном случае лучше использовать приведение через ЕстьNULL(Поле, ЗаменяющееЗначение)

  1. Используйте внутреннее соединение вместо левого или правого соединения. Естественно, если вы уверены, что замена на внутреннее соединение не поменяет логику запроса.

См. также

Экранирование кода

// sonar:UsingLeftOuterJoin:off
// sonar:UsingLeftOuterJoin:on