В моей таблице есть битовый столбец, который можно обнулять (устаревшая система ...), и другой разработчик недавно внес изменение в хранимую процедуру, чтобы показывать только те значения, для которых этот битовый столбец не был истинным (1). Поскольку это столбец, допускающий значение NULL, мы заметили, что если столбец имеет значение NULL, запись не берется. Почему это?
И другой разработчик, и я согласны с тем, что NULL <> 1 ... Это ошибка в SQL или она была разработана таким образом? Похоже на недостаток дизайна.
Текущий код:
(VoidedIndicator <> 1)
Предлагаемое исправление:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
Разъяснение (Джон Эриксон)
VoidedIndicator - это обнуляемое битовое поле, поэтому он может иметь следующие значения: NULL, 0 или 1
Когда оператор SQL создается с предложением where, например (VoidedIndicator <> 1), мы получаем только те записи, которые имеют VoidedIndicator == 0, но мы ожидали, что VoidedIndicator == 0 и VoidedIndicator IS NULL. Почему это?