Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
dbbook(2010.04.15).pdf
Скачиваний:
51
Добавлен:
09.06.2015
Размер:
2.14 Mб
Скачать

2.3.3. Следствия

К каким следствиям приводят правила? Следствием является нарушение привычных законов вычислений. В частности, для операций арифметических, логических, строковых и сравнения имеем при null-значении операнда x следующую табл. 2.3.

Таблица 2.3.: Примеры значений выражений при null-значении операнда x

Операции

Выражение

Значение

арифметические

x 0

null

 

x x

 

логические

x or not x

null

строковые

0Иванов0+0 0 + x

null

 

x < x

 

сравнения

x = x

null

x 6= x

 

 

 

x > x

 

 

 

 

Следовательно, число нуль уже не является поглощающим элементов для операции умножения, закон исключенного третьего уже не имеет места, отношение равенства не рефлексивно и нельзя сказать, равно или нет null-значение самому себе.

Таким образом, null-значение не является значением в обычном смысле этого слова и непосредственное сравнение выражения с null-значением невозможно, так как при любых значениях операнда x в результате сравнения x = null будет получено null-значение.

Как проверить значение переменной или выражения на null-значение? Следует использовать специальный встроенный предикат IsNull(выражение) – «есть null». Предикат возвращает значение false или true (но не null) и может применяться к выражению любого типа (примеры приведены в табл. 2.4).

Таблица 2.4.: Примеры значений предиката IsNull

IsNull(Выражение)

Значение

IsNull(0)

false

IsNull(x+0abc0 + null)

true

IsNull(2 null)

true

Ясно, что применительно к пустым значениям предикат IsNull всегда возвращает значение false.

2.3.4. Проверка условий

Как null-значения влияют на проверку условий в условных операторах и операторах цикла? В контексте возможных логических значений false, null и true null-значение имеет смысл как бы третьего логического значения, и потому на него часто ссылаются как на значение unknown – «неизвестный».

Однако в СУБД реализуется двухзначная логика. Поэтому неопределенное условие, то есть условие с результирующим null-значением, должно быть проинтерпретировано либо как false, либо как true.

В условных операторах и операторах цикла неопределенное условие по умолчанию интерпретируется как false:

if P then A else B –

при IsNull(P) выполнится B

if not P then

B else

A – при IsNull(P) выполнится A

while P do A;

B – при IsNull(P) выполнится B

Неожиданным следствием является неэквивалентность условных операторов, один из которых получен из другого отрицанием условия и перестановкой ветвей. Различие в том, что null-значению условия P в первом случае соответствует оператор B, а во втором – оператор A. Действительно, если во втором случае условие P имеет null-значение, то его отрицание not P также имеет null-значение,

исогласно общему правилу будет выполняться ветвь else, соответствующая оператору A.

Как null-значения влияют на проверку условий в ограничениях целостности? В ограничениях

целостности, представляющих собой условия корректности вводимых данных, неопределенное условие интерпретируется как true, поскольку отвергнуть нужно лишь заведомо некорректные данные. Например, проверочное условие check(x > 0) позволит ввести и положительные значения x, и null- значение.

Как переопределить правила вычислений с null-значениями, действующими по умолчанию? С помощью встроенной функции подмены null-значения IfNull(выражение1, выражение2). Функция возвращает значение 1-го выражения, если оно не является null-значением, и значение 2-го выражения в противном случае (примеры приведены в табл. 2.5). Выражения 1 и 2 могут быть любого, но, понятно, совместимого типа.

С помощью функции подмены интерпретацию неопределенных условий по умолчанию можно представить в явном виде:

if IfNull(P, false) then A else B while IfNull(P, false) do A; B

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]