Manipular NULLs
Um valor NULL significa nenhum valor ou desconhecido. Não significa zero ou em branco, ou mesmo uma cadeia vazia. Esses valores não são desconhecidos. Um valor NULL pode ser usado para valores que ainda não foram fornecidos, por exemplo, quando um cliente ainda não forneceu um endereço de e-mail. Como você viu anteriormente, um valor NULL também pode ser retornado por algumas funções de conversão se um valor não for compatível com o tipo de dados de destino.
Muitas vezes, você precisará tomar medidas especiais para lidar com NULL. NULL é realmente um não-valor. É uma incógnita. Não é igual a nada e não é desigual a nada. NULL não é maior ou menor do que qualquer coisa. Não podemos dizer nada sobre o que é, mas às vezes precisamos trabalhar com valores NULL. Felizmente, o T-SQL fornece funções para conversão ou substituição de valores NULL.
ISNULO
A função ISNULL usa dois argumentos. A primeira é uma expressão que estamos a testar. Se o valor desse primeiro argumento for NULL, a função retornará o segundo argumento. Se a primeira expressão não for nula, ela será retornada inalterada.
Por exemplo, suponha que a tabela Sales.Customer em um banco de dados inclua uma coluna MiddleName que permita valores NULL. Ao consultar esta tabela, em vez de retornar NULL no resultado, você pode optar por retornar um valor específico, como "Nenhum".
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
Os resultados dessa consulta podem ter esta aparência:
FirstName
MiddleIfAny
LastName
Orlando
N.
Pô
Keith
Nenhuma
Edgar
Donna
F.
Gonzales
...
...
...
Nota
O valor substituído por NULL deve ser o mesmo tipo de dados que a expressão que está sendo avaliada. No exemplo acima, MiddleName é um varchar, portanto, o valor de substituição não pode ser numérico. Além disso, você precisará escolher um valor que não aparecerá nos dados como um valor regular. Às vezes, pode ser difícil encontrar um valor que nunca aparecerá em seus dados.
O exemplo anterior manipulava um valor NULL na tabela de origem, mas você pode usar ISNULL com qualquer expressão que possa retornar um NULL, incluindo aninhamento de uma função TRY_CONVERT dentro de uma função ISNULL.
COALESCE
A função ISNULL não é padrão ANSI, então você pode querer usar a função COALESCE em vez disso. COALESCE é um pouco mais flexível na medida em que pode tomar um número variável de argumentos, cada um dos quais é uma expressão. Ele retornará a primeira expressão na lista que não é NULL.
Se houver apenas dois argumentos, COALESCE se comporta como ISNULL. No entanto, com mais de dois argumentos, COALESCE pode ser usado como uma alternativa a uma expressão CASE com várias partes usando ISNULL.
Se todos os argumentos forem NULL, COALESCE retornará NULL. Todas as expressões devem retornar os mesmos tipos de dados ou compatíveis.
A sintaxe é a seguinte:
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
O exemplo a seguir usa uma tabela fictícia chamada HR. Salários, que inclui três colunas que contêm informações sobre os ganhos semanais dos funcionários: a taxa horária, o salário semanal e uma comissão por unidade vendida. No entanto, um funcionário recebe apenas um tipo de remuneração. Para cada funcionário, uma dessas três colunas terá um valor, as outras duas serão NULL. Para determinar o valor total pago a cada funcionário, você pode usar COALESCE para retornar apenas o valor não nulo encontrado nessas três colunas.
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
Os resultados podem ser mais ou menos assim:
EmployeeID
Ganhos Semanais
1
899.76
2
1001.00
3
1298.77
...
...
NULLIF
A função NULLIF permite que você retorne NULL sob determinadas condições. Esta função tem aplicações úteis em áreas como limpeza de dados, quando você deseja substituir caracteres em branco ou espaço reservado por NULL.
NULLIF usa dois argumentos e retorna NULL se eles forem equivalentes. Se eles não forem iguais, NULLIF retornará o primeiro argumento.
Neste exemplo, NULLIF substitui um desconto de 0 por um NULL. Ele retorna o valor do desconto se não for 0:
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
Os resultados podem ser mais ou menos assim:
SalesOrderID
ProductID
UnitPrice
Discount
71774
836
356.898
NULL
71780
988
112.998
0.4
71781
748
818.7
NULL
71781
985
112.998
0.4
...
...
...
...