Critérios de pesquisa e comparação NULL
O valor NULL significa que o valor dos dados para a coluna é desconhecido ou não está disponível. NULL não é sinônimo de zero (valor numérico ou binário), uma cadeia de caracteres de comprimento zero ou espaço em branco (valor de caractere). Ou ainda, valores nulos lhe permitem distinguir entre uma entrada zero (colunas numéricas), em branco (colunas de caractere) e nonentry (NULL para ambos numérico e colunas de caractere).
NULL pode ser inserido em uma coluna para a qual são permitidos valores nulos (como especificado na instrução CREATE TABLE) de dois modos:
O SQL Server inserirá automaticamente o valor NULL se nenhum dado for digitado e não houver padrão ou restrição DEFAULT na coluna ou no tipo de dados.
O usuário pode entrar o valor NULL explicitamente digitando NULL sem aspas. Se a palavra NULL é digitada em uma coluna de caractere com aspas, ela é tratada como letras N, U, L e L, não como um valor nulo.
Quando são recuperados valores nulos, um aplicativo exibe uma cadeia de caracteres como NULL, ou (NULL), ou (nulo) na posição apropriada. Por exemplo, a coluna Color da tabela Product permite valores nulos:
USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL
Comparando valores nulos
Cuidado ao comparar valores nulos. O comportamento da comparação depende da configuração da opção SET ANSI_NULLS.
Quando SET ANSI_NULLS é ON, o resultado de uma comparação entre uma ou mais expressões é NULL, e ele não retorna TRUE ou FALSE; retorna UNKNOWN. Isso porque um valor desconhecido não pode ser comparado logicamente com outro valor. Isso acontecerá se uma expressão for comparada ao NULL literal, ou se forem comparadas duas expressões e uma delas for avaliada como NULL. Por exemplo, a comparação seguinte sempre retorna UNKNOWN quando ANSI_NULLS for ON:
ytd_sales > NULL
A comparação seguinte também retorna UNKNOWN sempre que a variável contém o valor NULL:
ytd_sales > @MyVariable
Use as cláusulas IS NULL ou IS NOT NULL para testar um valor NULL. Isso pode adicionar complexidade à cláusula WHERE. Por exemplo, a coluna TerritoryID na tabela AdventureWorks2008R2Customer permite valores nulos. Se uma instrução SELECT for testada para obter valores nulos além de outros, ela deve incluir uma cláusula IS NULL:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
OR TerritoryID IS NULL
Transact-SQL oferece suporte a uma extensão que permite aos operadores de comparação retornarem TRUE ou FALSE ao comparar valores nulos. Essa opção é ativada configurando ANSI_NULLS OFF. Quando ANSI_NULLS é OFF, comparações, como ColumnA = NULL, retornam TRUE quando ColumnA contém um valor nulo e FALSE quando ColumnA contém um valor além de NULL. A comparação de duas expressões que são avaliadas como NULL também retorna TRUE. A configuração de ANSI_NULLS não afeta colunas unidas que contêm NULL. As linhas das colunas unidas que contêm NULL não fazem parte do conjunto de resultados. Com ANSI_NULLS definido como OFF, a instrução SELECT a seguir retorna todas as linhas na tabela Customer para a qual Region é um valor nulo:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL
Independentemente da configuração ANSI_NULLS, valores nulos são sempre considerados iguais para as palavras-chave ORDER BY, GROUP BY e DISTINCT. Além disso, um índice exclusivo ou uma restrição UNIQUE que permite NULL pode conter somente uma linha com valor chave NULL. Uma linha subsequente com NULL é rejeitada. Uma chave primária não pode ter NULL em nenhuma coluna que faça parte da chave.
Computações que envolvem NULL avaliam NULL porque o resultado deve ser UNKNOWN se qualquer um dos fatores for desconhecido. Por exemplo, column1 + 1 será avaliado como NULL se column1 for NULL.
Quando as colunas que estão sendo pesquisadas incluem aquelas definidas para permitir valores nulos, você pode encontrar valores nulos ou não nulos no banco de dados com o seguinte padrão:
WHERE column_name IS [NOT] NULL