Ilustração conceitual das funções NVL, NVL2 e COALESCE em SQL para manipulação de valores NULL.
Foto de Roberto Sobrinho
Roberto Sobrinho

03/11/2025

NVL, NVL2 e COALESCE no Oracle SQL: diferenças e exemplos práticos de uso

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

  • NVL substitui o valor nulo por outro definido.
  • NVL2 permite retornar resultados diferentes conforme o valor exista ou não.
  • COALESCE verifica várias expressões e retorna o primeiro valor não nulo encontrado.

FunçãoExpressãoExemploResultado
NVLNVL(expr1, expr2)NVL(NULL, 0)0
NVL2NVL2(expr1, expr2, expr3)NVL2(NULL, 'Sim', 'Não')Não
COALESCECOALESCE(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

Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print