Lidar com NULLs

Concluído

Um valor NULL significa nenhum valor ou desconhecido. Ele não significa zero, em branco ou uma cadeia de caracteres 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 email. 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á seguir etapas especiais para lidar com NULL. Na verdade, NULL é um não valor. Ele é desconhecido. Ele não é igual a nada e não é diferente de nada. NULL não é maior ou menor que nada. 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.

ISNULL

A função ISNULL usa dois argumentos. O primeiro é uma expressão que estamos testando. Se o valor desse primeiro argumento for NULL ou estiver vazio, 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 essa tabela, em vez de retornar NULL no resultado, você pode optar por retornar um valor específico, como "None".

SELECT FirstName,
      ISNULL(MiddleName, 'None') AS MiddleIfAny,
      LastName
FROM Sales.Customer;

Os resultados dessa consulta podem ter a seguinte aparência:

Nome

MiddleIfAny

LastName

Orlando

N.

Gee

Keith

Nenhum

Howard

Donna

F.

Gonzales

...

...

...

Observação

O valor substituído por NULL deve ser o mesmo tipo de dados que a expressão que está sendo avaliada. No exemplo acima, o 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 será exibido nos dados como um valor regular. Às vezes, pode ser difícil encontrar um valor que nunca seja exibido em seus dados.

O exemplo anterior processou um valor nulo na tabela de origem, mas você pode usar ISNULL com qualquer expressão que possa retornar NULL, incluindo o aninhamento de uma função TRY_CONVERT em uma função ISNULL.

COALESCE

A função ISNULL não é um padrão ANSI, portanto, talvez seja melhor usar a função COALESCE em vez dela. COALESCE é um pouco mais flexível porque pode usar 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 comportará como ISNULL. No entanto, com mais de dois argumentos, COALESCE pode ser usada como uma alternativa a uma expressão CASE multipartes usando ISNULL.

Se todos os argumentos forem o NULL, COALESCE retorna NULL. Todas as expressões devem retornar os mesmos tipos de dados ou tipos compatíveis.

A sintaxe dela é a seguinte:

SELECT COALESCE ( expression1, expression2, [ ,...n ] )

O exemplo a seguir usa uma tabela fictícia chamada HR. Wages, que incluem três colunas que contêm informações sobre os ganhos semanais dos funcionários: a taxa por hora, o salário semanal e uma comissão por unidade vendida. No entanto, um funcionário recebe apenas um tipo de pagamento. Para cada funcionário, uma dessas três colunas terá um valor; os outros dois serão nulos. 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 do tipo:

EmployeeID

WeeklyEarnings

1

899.76

2

1001.00

3

1298.77

...

...

NULLIF

A função NULLIF permite que você retorne NULL sob determinadas condições. Essa função tem aplicações úteis em áreas como limpeza de dados, quando você deseja substituir caracteres em branco ou de espaço reservado por NULL.

NULLIF aceita dois argumentos e retorna NULL se eles forem equivalentes. Se eles não forem iguais, NULLIF retorna o primeiro argumento.

Neste exemplo, NULLIF substitui um desconto de 0 por um NULL. Ele retornará o valor de desconto se não for 0:

SELECT SalesOrderID,
      ProductID,
      UnitPrice,
      NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;

Os resultados podem ser do tipo:

SalesOrderID

ProductID

UnitPrice

Desconto

71774

836

356.898

NULO

71780

988

112.998

0,4

71781

748

818.7

NULO

71781

985

112.998

0,4

...

...

...

...