Проблема представления в базах данных отсутствующей (missing) информации настолько же стара, как и сами базы данных. Решение, которое принято в SQL, обладает массой недостатков, которые описаны в разнообразных источниках, в том числе, в многочисленных статьях Криса Дейта и его сподвижников. В свое время к этому анализу и я. Здесь стоит лишь дополнительно заметить, что ситуация с трехзначной логикой в SQL, на мой взгляд, еще более ухудшилась после введения в стандарте SQL:1999 «булевского» типа данных, в котором NULL является третьим истинностным значением (сохраняя при этом смысл обозначения неопределенного значения).
Поэтому трудно предполагать, как это делает Клод Рубинсон в своей заметке , что Дейт плохо понимает смысл трехзначной логики SQL. Скорее Рубинсон плохо понимает Дейта. Фактически, в своих последних критических замечаниях по поводу неопределенных значений и трехзначной логики в SQL Дейт приводит примеры запросов, при формальном вычислении которых в соответствии с прямолинейной трактовкой неопределенных значений получаются результаты, противоречащие смыслу. На мой взгляд, логика Дейта, в отличие от логики SQL, безупречна.
Если NULL используется в каком-то столбце таблицы для обозначения некоторого неизвестного значения, то, конечно, в этом столбце NULL обозначает какое-то значение типа данных этого столбца. Конечно, если сравнивать неизвестные значения одного и того же атрибута двух разных сущностей (одного столбца двух разных строк таблицы), то мы должны получить логическое значение unknown (или опять-таки NULL по странным правилам SQL). Но если сравнивать неизвестное значение некоторого атрибута некоторой сущности с ним же самим, то мы по смыслу получим true, поскольку это не зависит от реального значения атрибута, которое нам неизвестно. Т.е., на самом деле, поскольку NULL – это не значение, а обозначение значения, при сравнении «неопределенных значений» нужно учитывать, откуда они берутся. Обратимся еще раз к примерной базе данных, представленной на рис. 1 заметки Рубинсона: