Неопределенные значения
Поддержка неопределенных значений является одной из наиболее запутанных проблем современной технологии баз данных. Автору данной статьи неизвестно какое-либо удовлетворительное решение проблемы. ODMG тщательно обходит проблему неопределенных значений и пытается свести ее к проблеме неопределенных идентификаторов объектов.39 Опишем подход ODMG с минимальными комментариями.
Результатом выборки свойства объекта с пустым идентификатором является специальное значение UNDEFINED . В OQL UNDEFINED считается специальным литеральным значением, входящим во множество значений любого литерального или объектного типа.40
Правила обращения со значением UNDEFINED состоят в следующем:
Результатом операции is _ undefined ( UNDEFINED ) является логическое значение true . Результатом операции is _ defined ( UNDEFINED ) является логическое значение false .
Если при вычислении предиката раздела WHERE OQL -запроса получается значение UNDEFINED , то оно трактуется таким же образом, если бы результатом было значение false .
UNDEFINED является допустимым элементом любой явно или неявно конструируемой коллекции.41
UNDEFINED является допустимым выражением при вычислении агрегатной функции COUNT .42
Результатом любой другой операции, включающей хотя бы один операнд со значением UNDEFINED , является UNDEFINED . 43
Пример 2.11. Найти номера отделов всех сотрудников.
SELECT E.WORKS.DEPT_NO
FROM EMPLOYEES E
Результатом запроса будет мультимножество литералов, среди которых будет содержаться значение UNDEFINED для всех сотрудников, не прикрепленных к какому-либо отделу.
Пример 2.11. Найти всех сотрудников, прикрепленных к какому-либо отделу.
SELECT E
FROM EMPLOYEES E
WHERE is_defined (E.WORKS.DEPT_NO)
Такой же результат был бы выдан при выполнении запроса
SELECT E
FROM EMPLOYEES E
WHERE E.WORKS != nil