CodeGym /Cursos /SQL SELF /Tratando NULL em cálculos com COALESCE()

Tratando NULL em cálculos com COALESCE()

SQL SELF
Nível 9 , Lição 3
Disponível

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.

2
Tarefa
SQL SELF, nível 9, lição 3
Bloqueado
Substituindo valores NULL pelo valor padrão
Substituindo valores NULL pelo valor padrão
2
Tarefa
SQL SELF, nível 9, lição 3
Bloqueado
Substituição de valores NULL com múltiplos níveis de prioridade
Substituição de valores NULL com múltiplos níveis de prioridade
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION