Q:

Qual a diferença entre COALESCE e NVL

No Oracle quando temos uma tabela que possui dois campus A e B, e na seleção (select) queremos mostrar B quando o A for nulo temos dois comandos que nos apresentam a solução: 
Coalesce
Select COALESCE(A,B) Teste
 from TabelaTeste

NVL
Select NVL(A,B) Teste
     from TabelaTeste

Qual a diferença entre estes comandos? Algum é mais performático? Quais critérios devo utilizar para escolher?

A:

A função NVL é específica do Oracle e só aceita duas expressões como entrada. 
Se a primeira expressão for nula, a função retornará a segunda expressão. Caso contrário, será retornada a primeira expressão.
As expressões de entrada também podem ser de tipos diferentes, caso isso aconteça, será feita uma tentativa de cast implícito, se o cast não for possível será retornado um erro.
Além disso, esta função sempre avalia as duas expressões de entrada, fazendo com que ela seja levemente menos performática que a COALESCE.
Ilustração da função NVL:
.
Imagem da documentação
O COALESCE faz parte do padrão ANSI-92, portanto é um comando que existe em todos os bancos de dados que seguem este padrão ou superiores.
Ele retorna sempre o primeiro valor não-nulo na lista de expressões. É preciso especificar, no mínimo, duas expressões, mas pode-se especificar mais.
Ilustração da função COALESCE:

Imagem da documentação

A:

As diferenças são:

COALESCE segue o padrão ANSI enquanto o NVL é específico do Oracle;
NVL aceita apenas 2 agurmentos enquanto que COALESCE pode receber múltiplos argumentos;
NVL executa ambos argumentos e COALESCE para na primeira ocorrência de um valor não-nulo;
NVL faz uma conversão implícita do tipo de dado baseado no primeiro parâmetro informado, COALESCE espera que todos os parâmetros sejam do mesmo tipo;

Exemplo:
select nvl('abc',10) from dual; Irá funcionar com a conversão implícita do número 10 para string.
select coalesce('abc',10) from dual; Irá gerar o seguinte erro: "Inconsistent datatypes: expected CHAR got NUMBER".

COALESCE tem problemas em queries que usam clausulas UNION (Exemplo abaixo);

Exemplo:
SELECT COALESCE(a, sysdate) 
from (select null as a from dual 
      union 
      select null as a from dual
      );

Irá dar o seguinte erro: "ORA-00932: inconsistent datatypes: expected CHAR got DATE".
SELECT NVL(a, sysdate) 
from (select null as a from dual 
      union 
      select null as a from dual
      ) ;

Executará com sucesso.
Fonte: Stack Overflow

