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 oCASE
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
eCOALESCE
. OISNULL
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 é consideradoNULL
. - Validações para
ISNULL
eCOALESCE
também são diferentes. Por exemplo, umNULL
valor paraISNULL
é convertido paraint
embora paraCOALESCE
, você deve fornecer um tipo de dados. ISNULL
leva apenas dois parâmetros. Por outro ladoCOALESCE
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.