Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server COALESCE() explicado


No SQL Server, o COALESCE() expressão retorna seu primeiro argumento não nulo.

A forma como funciona é, passamos uma lista de argumentos para a expressão, ela avalia os argumentos em ordem e retorna o valor atual da primeira expressão que inicialmente não é avaliada como NULL .

Sintaxe


A sintaxe fica assim:
COALESCE ( expression [ ,...n ] )

Exemplo


Aqui está um exemplo simples para demonstrar:
SELECT COALESCE(null, 'Cat', 'Dog');

Resultado:
Cat

Neste caso, Cat foi o primeiro argumento não NULL, então COALESCE() retornou esse valor.

Expressões


Como mencionado, COALESCE() retorna o valor atual da primeira expressão que inicialmente não é avaliada como NULL . Portanto, se passarmos uma expressão como esta:
SELECT COALESCE( null, 2 * 3 );

Obtemos isso:
6

A função retorna o tipo de dados da expressão com a precedência de tipo de dados mais alta. Se todas as expressões forem não anuláveis, o resultado será digitado como não anulável.

Quando todos os argumentos são NULL


Se todos os argumentos forem NULL , COALESCE() retorna NULL . No entanto, pelo menos um dos valores nulos deve ser um NULL digitado , caso contrário, ocorrerá um erro.

Em outras palavras, eles não podem ser todos NULL constante:
SELECT COALESCE( null, null );

Obtemos isso:
Msg 4127, Level 16, State 1, Line 1
At least one of the arguments to COALESCE must be an expression that is not the NULL constant.

Neste caso, todos os argumentos eram NULL constante e, portanto, um erro foi retornado.

Abaixo está um exemplo de banco de dados para demonstrar um cenário em que COALESCE() retorna NULL quando todos os argumentos são NULL .

Suponha que executemos a seguinte consulta:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultado:
CustomerId  CustomerCategoryId
----------- ------------------
NULL        NULL

Ambas as colunas contêm NULL valores.

Então, se passarmos ambas as colunas para COALESCE() , obtemos um resultado de NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultado:
NULL

O mesmo acontece se substituirmos uma das colunas pelo NULL constante:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

Resultado:
NULL

Portanto, é somente quando todos argumentos são os NULL constante que obtemos um erro.

Substituir NULL Resultados com um valor conhecido


Podemos incluir um valor conhecido como o último argumento para substituir qualquer resultado NULL por esse valor conhecido.

Por exemplo, a consulta a seguir retorna NULL :
SELECT SUM( UnitPrice ) 
FROM Sales.SpecialDeals;

Resultado:
NULL

Nesse caso, o UnitPrice coluna contém valores NULL em todas as linhas e, portanto, o resultado foi NULL .

Podemos usar COALESCE() assim:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;

Resultado:
0.00

Agora, o resultado NULL é substituído por um valor conhecido (zero).

COALESCE() vs CASE


O COALESCE() expressão é na verdade um atalho sintático para o CASE expressão. Quando usamos o COALESCE() expressão, o otimizador de consulta a reescreve como um CASE expressão.

Quando executo a seguinte declaração:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;

O otimizador de consulta o reescreve para o seguinte:
CASE 
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] 
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID] 
END

COALESCE() vs ISNULL()


De certa forma, o COALESCE() expressão é semelhante a ISNULL() função. Mas há diferenças. Em particular:
  • ISNULL() é uma função e é avaliada apenas uma vez. COALESCE() por outro lado, é uma expressão e pode ser avaliada várias vezes.
  • A determinação do tipo de dados da expressão resultante é diferente. ISNULL usa o tipo de dados do primeiro parâmetro, COALESCE segue o CASE regras de expressão e retorna o tipo de dados de valor com a precedência mais alta.
  • A NULLability da expressão de resultado é diferente para ISNULL e COALESCE . O ISNULL o valor de retorno é sempre considerado NOT NULLable (assumindo que o valor de retorno é não anulável). Por outro lado,COALESCE com parâmetros não nulos é considerado NULL .
  • Validações para ISNULL e COALESCE também são diferentes. Por exemplo, um NULL valor para ISNULL é convertido para int embora para COALESCE , você deve fornecer um tipo de dados.
  • ISNULL leva apenas dois parâmetros. Por outro lado COALESCE recebe um número variável de parâmetros.

Mais informações


Consulte a documentação da Microsoft para obter mais detalhes e exemplos mais complexos.