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
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
Respostas:
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/
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á.
ISNULL
retorna um valor com o mesmo tipo de dados do primeiro parâmetro
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.
É 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
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/
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
por exemplo
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
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 comoCOALESCE
faz.