Атрибут класса, объявленный с типом bool, в БД имеет тип bit и может иметь 3 значения:
- 1, если явно записать в атрибут значение
True
; - 0, если явно записать в атрибут значение
False
; - NULL, если в него ничего не записывать.
NULL-значение имеет подводные камни: на интерфейсе пользователя такое значение отображается как False
, т.е. галочка у пользователя выставлена не будет. Однако значение NULL не учитывается при запросах сервисом данных, если на него наложено ограничение.
Булевский атрибут называется Исполнено
. Когда происходит фильтрация по установленому признаку Исполнено
, то ищутся все, у кого “Исполнено = 1”.
Когда необходимо найти, у кого признак не установлен, то ищется по признаку “НЕ (Исполнено = 1)”, при этом значения NULL игнорируются (это нормальное поведение СУБД). Чтобы явно найти все, у кого признак не установлен, надо писать “НЕ (НЕПУСТО(Исполнено))”.
В итоге противоречие: для пользователя в интерфейсе и в его сознании есть только 2 значения, а при фильтрации данных система работает с 3-мя.
Чтобы этого избежать, можно:
- зашить обработку в технологию. При этом надо понимать, что есть системы, в которых используют все три состояния. Из жизни такие ситуации идут, как правило, из импортов, когда в БД попадает NULL осознанно.
- на уровне прикладной задачи и в БД устанавливать значения по умолчанию. Тем самым исключая возможность необдуманного занесения значения NULL в БД Системы. И это является наиболее правильным способом, т.к всегда надо знать, что в объекте что означает.