Hoje a gente vai se aprofundar mais no assunto de tratamento de NULL e conhecer uma função super útil — COALESCE(). Essa função deixa a vida muito mais fácil quando você precisa lidar com valores NULL nos seus dados.
Bora ver um exemplo: imagina que você tem uma tabela com dados dos funcionários, mas alguns deles não têm informação de salário. O que rola se a gente tentar aumentar todos os salários? Nada de bom. Não dá pra fazer operações com NULL. E se a gente quiser trocar os salários NULL por, sei lá, 0? É aí que entra a COALESCE().
COALESCE() é uma função que retorna o primeiro valor que não é NULL da lista de argumentos que você passar. Se tudo na lista for NULL, ela devolve NULL. Em outras palavras, ela fala: "Me dá o primeiro valor decente que você achar, por favor!"
Sintaxe
COALESCE(valor1, valor2, ..., valor_n)
valor1, valor2, ..., valor_n — são os argumentos que você passa pra função. Ela vai devolver o primeiro valor que não for NULL.
Exemplos de uso do COALESCE()
Vamos ver uns exemplos.
Exemplo 1: Trocando NULL por 0
Imagina que temos uma tabela salaries:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
A gente quer calcular o total dos salários - isso é fácil:
SELECT SUM(salary) AS total_salary
FROM salaries;
A função SUM() ignora NULL, então tá de boa.
Mas aí queremos calcular o total dos salários se a gente der um bônus de 1000 pra cada funcionário.
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
E aí o resultado começa a dar ruim. O melhor é já trocar os valores NULL usando a função COALESCE e botar 0 no lugar. Olha só como faz:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
Resultado:
| total_salary |
|---|
| 110000 |
Bem melhor e mais seguro.
Exemplo 2: Trocando NULL por um valor padrão
Agora, imagina que temos uma tabela students com nomes e endereços:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
A gente quer trocar NULL nos endereços por "Não informado":
SELECT name, COALESCE(address, 'Não informado') AS resolved_address
FROM students;
Resultado da consulta:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | Não informado |
| Lisa | Painful |
| Alex | Não informado |
Exemplo 3: Usando vários valores
Às vezes, você quer trocar NULL não só por um valor, mas por uma sequência de valores. Por exemplo, queremos pegar o nome, o nome de amigo ou usar "Sem nome" se nenhum deles estiver preenchido. Tabela users:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
Consulta:
SELECT user_id,
COALESCE(first_name, short_name, 'Sem nome') AS display_name
FROM users;
Resultado:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | Sem nome |
Uso prático do COALESCE()
No dia a dia, COALESCE() é tipo um salva-vidas pra trabalhar com dados que não estão perfeitos.
Vamos ver como ela ajuda em várias situações.
Exemplo 1: Trocando valores em campos de texto
Tabela original customers:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
Consulta:
SELECT name, COALESCE(address, 'Não informado') AS address
FROM customers;
Resultado:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | Não informado |
| Anna Song | 456 Oak Ave |
| Otto Art | Não informado |
| Liam Park | 789 Pine Rd |
Exemplo 2: Preparando dados pra relatórios
Tabela original sales:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
Consulta:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
Resultado:
| total_sales |
|---|
| 650 |
Erros comuns ao usar COALESCE()
Apesar de COALESCE() parecer simples e universal, dá pra cair em umas armadilhas com ela.
Tipos de dados incompatíveis. Todos os argumentos que você passa pra COALESCE() precisam ser compatíveis no tipo de dado. Por exemplo, não dá pra misturar string e número.
-- Erro
SELECT COALESCE(salary, 'Não informado') FROM employees;
-- salary é campo numérico, e 'Não informado' é texto.
Ignorar a ordem dos argumentos. COALESCE() devolve o primeiro valor que não for NULL, então a ordem dos argumentos faz toda a diferença.
GO TO FULL VERSION