Особенности интерпретации булевского значения

Атрибут класса, объявленный с типом bool, в БД имеет тип bit и может иметь 3 значения:

  • 1, если явно записать в атрибут значение True;
  • 0, если явно записать в атрибут значение False;
  • NULL, если в него ничего не записывать.

NULL-значение имеет подводные камни: на интерфейсе пользователя такое значение отображается как False, т.е. галочка у пользователя выставлена не будет. Однако значение NULL не учитывается при запросах сервисом данных, если на него наложено ограничение.

Булевский атрибут называется Исполнено. Когда происходит фильтрация по установленому признаку Исполнено, то ищутся все, у кого “Исполнено = 1”.

Когда необходимо найти, у кого признак не установлен, то ищется по признаку “НЕ (Исполнено = 1)”, при этом значения NULL игнорируются (это нормальное поведение СУБД). Чтобы явно найти все, у кого признак не установлен, надо писать “НЕ (НЕПУСТО(Исполнено))”.

В итоге противоречие: для пользователя в интерфейсе и в его сознании есть только 2 значения, а при фильтрации данных система работает с 3-мя.

Чтобы этого избежать, можно:

  • зашить обработку в технологию. При этом надо понимать, что есть системы, в которых используют все три состояния. Из жизни такие ситуации идут, как правило, из импортов, когда в БД попадает NULL осознанно.
  • на уровне прикладной задачи и в БД устанавливать значения по умолчанию. Тем самым исключая возможность необдуманного занесения значения NULL в БД Системы. И это является наиболее правильным способом, т.к всегда надо знать, что в объекте что означает.