Curso
Ao trabalhar com dados do mundo real, os valores ausentes são quase inevitáveis. Se você estiver limpando conjuntos de dados ou mesclando colunas, o SQL oferece uma solução simples, mas poderosa: a função COALESCE(). Este tutorial mostrará a você como o COALESCE() funciona, quando usá-lo e como aplicá-lo por meio de exemplos práticos - tudo em apenas algumas linhas de SQL.
O que é COALESCE() no SQL?
A função COALESCE() no SQL retorna o primeiro valor não nulo de uma lista de expressões. Se todos os valores forem nulos, ele retornará null. É comumente usado para lidar com valores ausentes ou combinar várias colunas em uma saída de fallback.
Quando você deve usar COALESCE()?
Essa função é útil para combinar os valores de várias colunas em uma só.
Por exemplo, uma tabela chamada usuários contém valores de work_email e personal_email dos usuários.
Usando a função COALESCE(), podemos criar uma coluna chamada e-mail, que mostra o endereço work_email do usuário se ele não for nulo. Caso contrário, você verá personal_email.
|
|
|
|
|
|
1 |
angel@datacamp.com |
nulo |
angel@datacamp.com |
|
2 |
nulo |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Sintaxe de COALESCE()
COALESCE(value_1, value_2, ...., value_n)
A função COALESCE() recebe pelo menos um valor (value_1). Ele retornará o primeiro valor não nulo da lista, da esquerda para a direita.
Por exemplo, ele verificará primeiro se value_1 é nulo. Caso contrário, ele retorna value_1. Caso contrário, ele verifica se value_2 é nulo. O processo continua até que a lista esteja completa.
COALESCE() pode ser usado com colunas, expressões ou constantes.
Exemplos práticos de COALESCE()
Execute e edite o código deste tutorial online
Executar códigoExemplo 1: Substituição de null por uma constante
Considere a tabela countries com uma lista de países e seus dias nacionais. Alguns valores de dias nacionais são nulos. COALESCE() preenche os valores ausentes em national_day com a string constante 'Unknown'.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
Os resultados são os seguintes:
|
|
|
|
|
|
1 |
Aruba |
nulo |
Desconhecido |
|
2 |
Afeganistão |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Observe como o valor null em national_day é substituído por uma constante Unknown.
Exemplo 2: Escolher entre duas colunas
Temos uma tabela chamada products. Ele contém o nome do produto e sua descrição. Algumas descrições são muito longas (mais de 60 caracteres). Nesse caso, substituímos a descrição pelo nome do produto.
A consulta a seguir usa CASE para converter descrições longas em NULL e, em seguida, usa COALESCE() para retornar ao nome do produto.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
Os resultados são os seguintes:
product_name |
|
|
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
G.Skill Ripjaws V Series |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Series |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Fator de forma:SSI CEB,Slots de RAM:8,RAM máxima:128GB" |
"CPU:LGA2011-3,Fator de forma:SSI CEB,Slots de RAM:8,RAM máxima:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Fator de forma:ATX,Slots de RAM:8,RAM máxima:64GB" |
"CPU:LGA2011,Fator de forma:ATX,Slots de RAM:8,RAM máxima:64GB" |
Observe como a coluna product_name_or_description exibe o product_name se o description for longo. Caso contrário, ele exibe o endereço description.
Exemplo 3: Lógica de fallback com várias colunas
Podemos levar o exemplo 2 um passo adiante. Suponha que existam atualmente dois requisitos:
- Se o comprimento do
descriptionfor menor que 60, exiba odescription. - Caso contrário, verifique se o comprimento do endereço
product_nameé menor que 20. Em caso afirmativo, exibimos o endereçoproduct_name. - Caso contrário, exiba
product.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
Os resultados são os seguintes:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Série:Ultimate SU800,Tipo:SSD,Capacidade:128GB,Cache:N/A |
produto |
|
ADATA ASU800SS-512GT-C |
Série:Ultimate SU800,Tipo:SSD,Capacidade:512GB,Cache:N/A |
produto |
|
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memória:16GBCore Clock:1.5GHz |
produto |
|
AMD 100-505989 |
Chipset:FirePro W9100,Memória:32GBCore Clock:930MHz |
Chipset:FirePro W9100,Memória:32GBCore Clock:930MHz |
Observe como a coluna product_name_or_description exibe o product_name ou o description, dependendo dos comprimentos do product_name ou do description.
Mecanismos SQL compatíveis
COALESCE() você trabalha no SQL Server (a partir de 2008), no banco de dados SQL do Azure, no Azure SQL Data Warehouse, no Parallel Data Warehouse, no BigQuery e no Amazon RedShift.
Funções SQL relacionadas
Considerações finais
A função COALESCE() é uma ferramenta versátil para lidar com valores nulos e simplificar suas consultas SQL. Se você estiver substituindo dados ausentes por padrões ou combinando várias colunas em uma, o site COALESCE() ajuda a manter sua lógica limpa e legível.
Você está pronto para aprofundar suas habilidades em SQL? Confira esses cursos para iniciantes e para impulsionar a carreira no DataCamp:
Perguntas frequentes
O que acontecerá se todos os valores em COALESCE() forem NULL?
Se todos os argumentos passados para a função COALESCE() forem NULL, a função retornará NULL.
Como COALESCE() é diferente de ISNULL() ou IFNULL()?
ISNULL()(SQL Server) eIFNULL()(MySQL, SQLite) aceitam apenas dois argumentos.-
COALESCE()pode aceitar vários argumentos e é mais padrão nos dialetos SQL. -
COALESCE()faz parte do padrão ANSI SQL, enquantoISNULL()eIFNULL()são específicos do banco de dados.
Posso usar COALESCE() com expressões ou funções?
Sim, você pode usar nomes de colunas, literais, funções ou expressões em COALESCE().
COALESCE(LOWER(name), 'unknown')Há algum custo de desempenho ao usar COALESCE()?
Em geral, o no-COALESCE() é eficiente. No entanto, se você usá-la com expressões complexas ou dentro de consultas grandes, o banco de dados poderá avaliar mais expressões do que o necessário, dependendo de como ela foi escrita.
A função COALESCE() funciona com tipos de dados diferentes?
Sim, mas todos os argumentos devem ser implicitamente conversíveis em um tipo de dados comum. Caso contrário, ele poderá retornar um erro de conversão de tipo, dependendo do mecanismo SQL que você possui.
Posso aninhar funções COALESCE()?
Sim. Você pode aninhá-los, embora isso raramente seja necessário, pois o COALESCE() já lida com vários argumentos:
COALESCE(col1, COALESCE(col2, 'default'))
Isso é equivalente a:
COALESCE(col1, col2, 'default')
