Função COALESCE em TSQL

109

Alguém pode explicar como funciona a função COALESCE em TSQL? A sintaxe é a seguinte

COALESCE (x, y)

O documento do MSDN sobre esta função é muito vago

Lloyd Banks
fonte

Respostas:

74

Disseram-me que o COALESCE é menos caro do que o ISNULL, mas as pesquisas não indicam isso. ISNULL aceita apenas dois parâmetros, o campo sendo avaliado como NULL e o resultado que você deseja se for avaliado como NULL. COALESCE tomará qualquer número de parâmetros e retornará o primeiro valor encontrado que não seja NULL.

Há uma descrição muito mais completa dos detalhes aqui http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

Bill Melius
fonte
6
Cuidado ao usar ISNULL, não é padrão, é menos flexível, eu li que ele retornará o tipo de dados do primeiro argumento sempre e não o tipo de dados do valor retornado como COALESCEfaz.
sprocket
215

Não sei por que você acha que a documentação é vaga.

Ele simplesmente passa por todos os parâmetros um por um e retorna o primeiro que é NOT NULL.

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

Ele aceita praticamente qualquer número de parâmetros, mas eles devem ser do mesmo tipo de dados. (Se eles não forem do mesmo tipo de dados, eles são implicitamente convertidos em um tipo de dados apropriado usando a ordem de precedência do tipo de dados .)

É como, ISNULL()mas para vários parâmetros, em vez de apenas dois.

É também ANSI-SQL, onde ISNULL()não está.

MatBailie
fonte
4
1 Para sua explicação sobre a precedência dos tipos de dados. Eu acredito que isso ISNULLretorna um valor com o mesmo tipo de dados do primeiro parâmetro
Lamak
5
Seu último exemplo de código deve fornecer o erro 'Pelo menos um dos argumentos para COALESCE deve ser um NULL digitado' Fonte: sql-server-performance.com/2007/…
maqk
2
A documentação diz muito, ao mesmo tempo que consegue fornecer um valor quase zero. Bons documentos fornecem um exemplo simples com um resultado simples. Coalesce passa imediatamente para expressions, comparações com CASE, comparações com ISNULL e, finalmente, um exemplo sem resultado. Em seguida, um exemplo excessivamente complexo com muitos detalhes. Quando tudo o que precisamos é essa resposta com 5 - 6 linhas de WTF, essa coisa é e faz.
P.Brian.Mackey
1
Detalhes de precedência de tipo
IsmailS
18

É assim que vejo o COALESCE ... e espero que faça sentido ...

De uma forma simplista….

Coalesce (FieldName, 'Vazio')

Portanto, isso se traduz em ... Se "FieldName" for NULL, preencha o valor do campo com a palavra "EMPTY".

Agora, para vários valores ...

Coalesce (FieldName1, FieldName2, Value2, Value3)

Se o valor em Fieldname1 for nulo, preencha com o valor em Fieldname2, se FieldName2 for NULL, preencha com Value2, etc.

Este pedaço de código de teste para o banco de dados de exemplo AdventureWorks2012 funciona perfeitamente e oferece uma boa explicação visual de como o COALESCE funciona:

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
John Waclawski
fonte
4

Há muito mais a unir do que apenas um substituto para ISNULL. Eu concordo plenamente que a "documentação" oficial da coalescência é vaga e inútil. Este artigo ajuda muito. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

CindyPsych
fonte
3
Esse artigo que você vinculou é extremamente enganoso (como é apontado por várias pessoas, incluindo o autor, na seção de comentários). Todos os truques legais que ele destaca podem ser TODOS feitos usando ISNULL no lugar de coalescer.
Hobo Spider
3

Aqui está uma consulta simples contendo coalescer -

select * from person where coalesce(addressId, ContactId) is null.

Ele retornará as pessoas em que addressId e contactId são nulos.

função de coalescência

  • leva pelo menos dois argumentos.
  • os argumentos devem ser do tipo inteiro.
  • retorna o primeiro argumento não nulo.

por exemplo

  • coalescer (nulo, 1, 2, 3) retornará 1.
  • coalesce (nulo, nulo) retornará nulo.
Neeraj Bansal
fonte
1

A definição mais simples da função Coalesce () poderia ser:

A função Coalesce () avalia todos os argumentos passados ​​e retorna o valor da primeira instância do argumento que não foi avaliado como NULL.

Nota: avalia TODOS os parâmetros, ou seja, não ignora a avaliação do (s) argumento (s) no lado direito do parâmetro retornado / NÃO NULO.

Sintaxe:

Coalesce(arg1, arg2, argN...)

Cuidado : além dos argumentos avaliados como NULL, todos os outros argumentos (NOT-NULL) devem ser do mesmo tipo de dados ou de tipos correspondentes (que podem ser "auto-convertidos implicitamente" em um tipo de dados compatível), consulte os exemplos abaixo:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

HTH

Eddie Kumar
fonte
0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str
Xiao
fonte
1
Achei que este é muito mais simples.
Xiao