Условия поиска при сравнении со значением NULL

Значение NULL означает, что значение данного столбца неизвестно либо недопустимо. NULL не является синонимом числового или двоичного нуля, строки с нулевой длиной или пустого символа. Значения NULL служат для отличия нулевых (для числовых столбцов) или пустых (для символьных столбцов) записей от отсутствия записей (NULL как для числовых, так и для символьных столбцов).

Значение NULL можно ввести в столбец, для которого разрешены значения NULL (что указано в инструкции CREATE TABLE), двумя способами.

  • SQL Server автоматически вводит значение NULL, если в столбец не введены данные и если нет значения по умолчанию или ограничения DEFAULT на этот столбец (или его тип данных).

  • Пользователь может явно ввести значение NULL путем ввода слова NULL без кавычек. Если слово NULL вводится в символьный столбец в кавычках, оно рассматривается как сочетание букв N, U, L и L, а не как значение NULL.

При получении значений NULL приложение обычно отображает в соответствующей позиции строку вида NULL, (NULL) или (null). Например, в столбце Color таблицы Product разрешены значения NULL:

USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL

Сравнение со значением NULL

При сравнении значений NULL необходимо соблюдать осторожность. Поведение среды при таком сравнении зависит от значения параметра SET ANSI_NULLS.

Если значение SET ANSI_NULLS равно ON, сравнение с одним или более выражениями, равными NULL, не выдает результат TRUE или FALSE, а выдает UNKNOWN. Это происходит потому, что неизвестное значение невозможно сравнить логически с каким-либо другим значением. Происходит это в двух случаях: либо когда выражение сравнивается с литералом NULL, либо когда сравниваются два выражения, одно из которых равно NULL. Например, результатом следующего сравнения всегда является UNKNOWN при параметре ANSI_NULLS, установленном в значение ON:

ytd_sales > NULL

Следующее сравнение также выдает результат UNKNOWN каждый раз, когда переменная содержит значение NULL:

ytd_sales > @MyVariable

Для тестирования на значение NULL используются предложения IS NULL или IS NOT NULL. Это может усложнить предложение WHERE. Например, столбец TerritoryID в таблице AdventureWorks2008R2Customer допускает значения NULL. Если инструкция SELECT используется для тестирования на значения NULL в дополнение к другим, она должна включать предложение IS NULL:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

Язык Transact-SQL поддерживает расширение, позволяющее операторам сравнения возвращать TRUE или FALSE при сравнении со значениями NULL. Эта функция активируется при установке параметра ANSI_NULLS OFF. Если значение ANSI_NULLS равно OFF, сравнения типа ColumnA = NULL возвращают значение TRUE, если столбец ColumnA содержит значение NULL, и FALSE — если столбец ColumnA содержит значение, отличное от NULL. Кроме того, сравнение двух выражений, результатом которых является значение NULL, возвратит значение TRUE. Настройка ANSI_NULLS не влияет на присоединенные столбцы, содержащие значения NULL. Строки из присоединенных столбцов, содержащих значения NULL, не являются частью результирующего набора. Если значение ANSI_NULLS равно OFF, следующая инструкция SELECT возвращает все строки таблицы Customer, в которых столбец Region содержит значение NULL:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL

Вне зависимости от значения параметра ANSI_NULLS значения NULL всегда считаются равными для ключевых слов ORDER BY, GROUP BY и DISTINCT. Кроме того, уникальный индекс или ограничение UNIQUE, для которых допустимо значение NULL, могут содержать только одну строку со значением ключа NULL. Последующие строки со значением NULL отклоняются. Для первичного ключа ни в одном из столбцов, являющихся частью ключа, не может быть значения NULL.

Результатом вычислений, в которых задействовано значение NULL, является значение NULL, так как если хотя бы один из факторов неизвестен, результат также должен быть неизвестен (UNKNOWN). Например, результатом выражения column1 + 1 является NULL, если значение column1 равно NULL.

При поиске столбцов, включая столбцы со значениями NULL, можно находить в базе данных значения NULL или отличные от них с помощью следующего шаблона:

WHERE column_name IS [NOT] NULL

См. также

Справочник

Основные понятия