РУКОВОДСТВО ПО РЕЛЯЦИОННОЙ СУБД DB2

         

ВЫБОРКА, ПРИ КОТОРОЙ ВОВЛЕКАЕТСЯ NULL (неопределенное значение)


Допустим, например, что значением в столбце СОСТОЯНИЕ для поставщика S5 является не 30, а неопределенное значение. Выдать номера поставщиков, у которых состояние больше, чем 25:

SELECT                НОМЕР_ПОСТАВЩИКА

FROM                   S

WHERE                СОСТОЯНИЕ > 25;

В результате получим:

НОМЕР_ПОСТАВЩИКА

S3

Здесь поставщик S5 не был назван в результате. Если неопределенное значение сравнивается с некоторым другим значением при вычислении предиката, то независимо от используемого оператора сравнения результатом сравнения никогда не является истина, даже если этот другой операнд также является неопределенным значением. Иными словами, если оказывается, что СОСТОЯНИЕ имеет неопределенное значение, то ни одно из следующих сравнений не будет принимать значение истина[12]:

СОСТОЯНИЕ > 25

СОСТОЯНИЕ < = 25

СОСТОЯНИЕ = 25

СОСТОЯНИЕ  Ø= 25

СОСТОЯНИЕ = NULL (Это недопустимая синтаксическая конструкция. См. ниже)

СОСТОЯНИЕ  Ø= NULL (Это — тоже).

Поэтому если издать запрос:

SELECT                НОМЕР_ПОСТАВЩИКА

FROM                   S

WHERE                СОСТОЯНИЕ < = 25;

и сравнить его результат с результатом предыдущего запроса, то можно установить, что поставщик S5 не появляется ни в одном из них. Результат приведенного запроса:

НОМЕР_ПОСТАВЩИКА

S1

S2

S4

Для проверки наличия (или отсутствия) неопределенного значения предусмотрен специальный предикат вида:

имя — столбца IS [NOT] NULL

Например:

SELECT                НОМЕР_ПОСТАВЩИКА

FROM                   S

WHERE                СОСТОЯНИЕ IS NULL;

В результате имеем:

НОМЕР_ПОСТАВЩИКА

S5

Синтаксическая конструкция «СОСТОЯНИЕ = NULL» является некорректной, поскольку ничто — и даже само неопределенное значение — не считается равным неопределенному значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов. Предложение SELECT DISTINCT (ВЫБРАТЬ РАЗЛИЧНЫЕ) даст в результате не более одного неопределенного значения. Аналогичным образом индекс со спецификацией UNIQUE (уникальный) будет допускать в индексируемом столбце не более одного неопределенного значения. Наконец, при упорядочении ORDER BY (УПОРЯДОЧИТЬ ПО) неопределенные значения интерпретируются, как будто бы они больше или равны всем значениям, не являющимся неопределенными).

Заметим, между прочим, что использование символа NULL во фразе SELECT не допускается. Например, следующая конструкция некорректна:

SELECT НОМЕР_ДЕТАЛИ, 'ВЕС = ', NULL

FROM   P

WHERE ВЕС IS NULL;



Содержание раздела