Для стандарт ANSI / ISO SQL, поведение null довольно строго определено. В двух словах:
Все выражения, включающие значения NULL
, оцениваются как NULL
, за исключением coalesce()
.
Все тесты, включающие NULL
значения, не пройдены, за исключением явных тестов на недействительность . Следующая ошибка:
X = null
null = null
X < null
- и т.д.
По сути, NULL
- это значение, которое находится за пределами области переменной. Это означает, что операторы обратного сравнения не являются симметричными WRT для NULL
.
Все приведенные ниже выражения, если задействовано значение NULL, сбой и значения NULL проваливаются.
* `X < null`
* `X >= null`
* `X > null`
* `not ( X > null )`
* etc.
In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`.
В вашем случае, чтобы тест прошел успешно, если значение равно нулю, вы можете сделать что-то вроде:
where ( A = B or B is null )
.
Это потерпит неудачу, если A равно нулю и B не равно нулю, или A и B не равно нулю и сравнивают неравно. Успешно, если A и B не равны NULL и сравниваются равными, или если B является NULL.
where A = coalesce(B,A)
. Это ведет себя так же, как вышеприведенное выражение. Я предпочитаю, так как синтаксис более лаконичен.
Обратите внимание, что некоторые реализации SQL допускают нулевое поведение, которое отличается от стандартного (например, MS / Sybase Transact-SQL, имеет возможность разрешить тестирование на нулевое значение с помощью стандартных операторов сравнения и разрешить null char
/ varchar
вести себя так, как если бы они были ноль (пустыми) строками. В более ранних версиях SQL Server недействительность была реализована путем создания переменной длины столбца независимо от ее типа. Нулевое значение хранилось с нулевой длиной. Для char
/ varchar
поля, ноль (пустая) строка была сохранена как один пробел. Не совсем интуитивно. Как побочный эффект, объявление как foo char(8) null
было эквивалентно объявлению foo varchar(8) null
.
Даже если ваша реализация SQL поддерживает нестандартное нулевое поведение, вы должны избегать его и кодировать, как если бы это был стандартный SQL с поведением нулей ANSI. В большинстве реализаций, которые поддерживают нестандартное нулевое поведение, это поведение настраивается с помощью параметра времени выполнения. Ваше стандартное кодирование даст одинаковые результаты, независимо от того, работаете ли вы при стандартном поведении NULL в нуле или нет.