No meu dia a dia, vejo isso com frequência profissionais experientes, escrevendo SQLs complexos, mas ainda com dúvidas sobre como lidar com valores NULL.
O NVL é o mais conhecido, o COALESCE passa despercebido em muitos casos e o NVL2 é pouco explorado.
Essas três funções tratam o mesmo problema, lidar com valores nulos, mas cada uma atua de forma diferente.
Compreender bem essas diferenças é essencial para garantir resultados consistentes e evitar erros silenciosos em consultas e relatórios.
Comparativo
NVLsubstitui o valor nulo por outro definido.NVL2permite retornar resultados diferentes conforme o valor exista ou não.COALESCEverifica várias expressões e retorna o primeiro valor não nulo encontrado.
| Função | Expressão | Exemplo | Resultado |
|---|---|---|---|
| NVL | NVL(expr1, expr2) | NVL(NULL, 0) | 0 |
| NVL2 | NVL2(expr1, expr2, expr3) | NVL2(NULL, 'Sim', 'Não') | Não |
| COALESCE | COALESCE(expr1, expr2, expr3, …) | COALESCE(NULL, NULL, 100) | 100 |
O que é NULL
Antes de tudo, NULL não é zero, não é string vazia e não é espaço em branco.NULL representa ausência de valor e o comportamento muda conforme o tipo de operação.
SELECT 10 + NULL AS SOMA,
'DBA' || NULL || ' Sobrinho' AS CONCATENACAO
FROM dual;Em cálculos, NULL anula o resultado.
Nas concatenações, é simplesmente ignorado.

NVL substituindo valores nulos
A função NVL(expr1, expr2) substitui o valor nulo (NULL) por outro definido pelo usuário.
NVL(expr1, expr2)
Se o primeiro valor for nulo, o Oracle retorna o segundo.
SELECT FIRST_NAME,
COMMISSION_PCT,
NVL(COMMISSION_PCT, 0) AS COMISSAO_TRATADA
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 142 AND 176;NVL é direto e ideal para cálculos ou colunas que não podem retornar nulo.

NVL2 retornando valores condicionais
Retorna um valor se o campo tiver dado e outro se estiver nulo
NVL2(expr1, expr2, expr3)
Se expr1 tem valor, retorna expr2.
Se expr1 é nulo, retorna expr3.
SELECT FIRST_NAME,
NVL2(COMMISSION_PCT, 'Tem comissão', 'Sem comissão') AS STATUS
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 142 AND 176;NVL2 é útil para exibir mensagens ou status baseados na existência ou ausência de valores em uma coluna.

COALESCE avaliando múltiplos valores
A função COALESCE retorna o primeiro valor não nulo encontrado em uma lista de expressões.
Ela é uma alternativa mais flexível ao NVL.
COALESCE(expr1, expr2, expr3, …)
O Oracle avalia as expressões da esquerda para a direita e retorna o primeiro valor que não seja nulo. Assim que encontra um valor válido, ele interrompe a verificação e devolve esse resultado
SELECT FIRST_NAME,
COMMISSION_PCT,
BONUS_PCT,
COALESCE(COMMISSION_PCT, BONUS_PCT, 0) AS COMISSAO_FINAL
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 142 AND 176;Funcionários que possuem comissão e bônus têm sempre a comissão priorizada, já que o Oracle avalia as colunas da esquerda para a direita e retorna o primeiro valor não nulo.
Aqueles que possuem apenas o bônus têm esse valor considerado no resultado final, enquanto os que não possuem nenhum dos dois recebem o valor 0, evitando que o campo fique nulo e garantindo consistência em cálculos, relatórios e análises financeiras.

Exemplo de funções encadeadas
Agora vamos juntar tudo o que vimos até aqui num exemplo mais completo, combinando NVL, NVL2 e COALESCE.
A ideia é calcular o valor total a receber de cada funcionário, considerando comissão, bônus e, se nenhum dos dois existir, retornando zero.
SELECT FIRST_NAME,
SALARY,
COMMISSION_PCT,
BONUS_PCT,
NVL2(COMMISSION_PCT,
NVL(COMMISSION_PCT * SALARY, 0),
COALESCE(BONUS_PCT * SALARY, 0)) AS BONUS_TOTAL
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 142 AND 176;O Oracle sempre avalia as funções de dentro para fora.
Isso significa que, antes de resolver o NVL2, ele primeiro avalia o que está dentro dele, neste caso, o NVL e o COALESCE.
O NVL2(COMMISSION_PCT, X, Y) verifica se o funcionário possui comissão (COMMISSION_PCT).
Se não possui comissão, o Oracle parte para o segundo argumento:COALESCE(BONUS_PCT * SALARY, 0), tentando usar o bônus e, se ele também for nulo, retornando 0.
Se possui comissão, o Oracle executa o primeiro argumento:NVL(COMMISSION_PCT * SALARY, 0) sempre garantindo que, mesmo que o cálculo resulte em NULL, o valor final seja 0.

Todo DBA precisa entender bem como funcionam as funções no Oracle.
Quem não domina comandos como NVL, NVL2 e COALESCE acaba se perdendo em análises e tirando conclusões erradas.
Dominar essas funções é essencial PARA dar suporte com segurança aos usuários e ter certeza de que está interpretando os dados da forma certa, principalmente quando a análise é feita em conjunto com desenvolvedores.
Esse tipo de conhecimento faz diferença no dia a dia e evita decisões baseadas em achismos que, sinceramente, ainda vejo muito por aí.
e zas
Referência Documentação Oracle:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/NVL.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/NVL2.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/COALESCE.html
Esse é exatamente o tipo de conteúdo que você vivencia no PowerLab SQL Oracle 1, o laboratório prático da DBASobrinho voltado para quem quer aprender Oracle na prática.
São ambientes reais, falhas simuladas e exercícios guiados que te ensinam a resolver problemas de verdade.
Confira as próximas edições em:
👉 https://dbasobrinho.com.br/cursos-treinamentos/
#20251103 #DBASobrinho #GuinaNãoTinhaDó #BóBó #CaceteDeAgulha #OracleACE



