Bora trocar uma ideia sobre mais uma função pra lidar com o misterioso NULL — NULLIF(). Ela salva a gente quando precisa trocar certos valores por NULL pra tratar os dados direitinho. Se prepara aí, porque essa jornada vai ser massa!
A função NULLIF() é uma baita ferramenta no PostgreSQL que deixa você comparar dois valores e retorna NULL se forem iguais, ou retorna o primeiro valor se forem diferentes. É tipo ela dizendo: "Se esses valores são iguais, esquece eles!"
Olha só a sintaxe básica da função:
NULLIF(valor1, valor2)
Se valor1 e valor2 forem iguais, o resultado vai ser NULL. Se forem diferentes, o resultado é valor1.
Exemplo:
SELECT NULLIF(10, 10); -- Resultado: NULL
SELECT NULLIF(10, 20); -- Resultado: 10
SELECT NULLIF('hello', 'hello'); -- Resultado: NULL
SELECT NULLIF('hello', 'world'); -- Resultado: 'hello'
Tranquilo, né? Agora bora ver como usar essa função em situações do dia a dia.
Exemplo 1: Evitando divisão por zero
Divisão por zero é o terror de qualquer dev. No SQL, tentar dividir por zero dá erro. É aí que NULLIF() entra em cena.
Imagina que a gente tem uma tabela sales com duas colunas: revenue (receita) e expenses (despesas). Queremos calcular a rentabilidade das despesas (revenue / expenses), mas às vezes as despesas são zero. Se rodar a query sem checar nada, vai dar erro de divisão por zero.
Tabela sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Query errada:
SELECT revenue / expenses AS profitability
FROM sales;
-- Erro: divisão por zero!
Resolvendo com NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Resultado:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Agora, se expenses for 0, NULLIF(expenses, 0) retorna NULL, e dividir por NULL não dá erro, só retorna NULL mesmo.
Exemplo 2: Trocando valores iguais por NULL
Pensa que você tem uma tabela de estudantes, com as colunas first_name e preferred_name. Às vezes o estudante prefere o nome real, às vezes escolhe outro. Se os dois nomes forem iguais, não faz sentido mostrar o preferred_name.
Tabela students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Query com NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Resultado:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Quando preferred_name e first_name são iguais, o resultado é NULL.
Exemplo 3: Filtrando dados
Às vezes você quer pegar só as linhas onde os valores de duas colunas são diferentes. Por exemplo, tem uma tabela de pedidos com original_price e discounted_price. Queremos achar só os pedidos que tiveram desconto.
Tabela orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Query com NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Resultado:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Só os pedidos com desconto aparecem no resultado.
Casos práticos de uso do NULLIF()
Caso 1: Escolhendo valor opcional
Quando você tá mexendo com dados, às vezes precisa escolher um valor entre várias colunas, ignorando os que são iguais a um certo valor. Por exemplo, temos uma lista de funcionários com salários: base_salary e bonus. Se o bônus for 0, queremos colocar 999 no lugar.
Tabela employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Query com NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Resultado:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Se bonus for 0, ele vira 999.
Caso 2: Contando linhas
Dá pra usar NULLIF() pra simplificar filtros mais chatos. Por exemplo, temos uma tabela de usuários e queremos numa query só saber o total de usuários e quantos são cadastrados (sem status guest).
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
Viu só? Com uma função só, NULLIF(), dá pra resolver vários problemas: evitar erro, deixar o código mais limpo e fácil de entender. Agora que você já sacou como ela funciona, tá mais perto de virar ninja em dados no PostgreSQL.
GO TO FULL VERSION