Fala, galera. Tudo bem?
Continuando a falar um pouco sobre funções de conversão e funções condicionais.
Hoje vamos falar de algumas funções muito utilizadas por nós desenvolvedores Oracle.
NVL
NVL2
COALESCE
NULLIF
CASE
DECODE
NVL
Muitas vezes temos colunas no banco de dados onde não existe nenhuma informação gravada, ou seja o campo está nulo, porém no resultado do nosso select é necessário a exibição de algum dado, pra isso podemos usar o NVL, exemplos abaixo:
Retornando todos os dados da tabela
Select * from Aluno;
Agora utilizando o NVL na coluna cod_turma, para que o comando funcione corretamente, o dado inserido na função pra retornar quando o campo estiver nulo, deve ser do mesmo tipo de dado da tabela, caso possível conversões também podem ser efetuadas. No exemplo abaixo, eu estou retornando "0" no campo cod_turma, sempre que o campo for nulo.
select cod_aluno,
nm_aluno,
nvl(cod_turma, o) cod_turma
from aluno;
Mais um exemplo da utilização do NVL, agora passando um campo varchar como parâmetro, repare que você pode escrever algo p/ retornar na sua query caso a coluna esteja nula.
select nm_instrumento
,tp_instrumento
,nvl(tp_instrumento, 'S/ Tipo cadastrado') tp_instrumentoNVL
from instr_musicais;
NVL2
No caso do NVL2 é possível trabalharmos com duas opções de retorno, passamos a coluna da tabela como parâmetro, caso a informação não seja nula, retorna a primeira literal escrita, caso seja nulo, retorna a segunda, no caso exemplo abaixo, se não for nulo retorna "S", e se for retorna "N", muito parecido com a estrutura de um IF, se você conhece lógica de programação, vai entender o que eu estou querendo dizer.
select cod_aluno,
nm_aluno,
cod_turma,
nvl2(cod_turma,'S','N') "Tem turma?"
from aluno;
COALESCE
Função COALESCE, é utilizando quando existe a necessidade de verificar se mais de uma coluna da tabela está nula, nessa função é possível utilizarmos N parâmetros, lembrando que todos os parâmetros devem ser do mesmo tipo de dado.
Exemplos:
No exemplo abaixo, estou testando dois parâmetros, caso estejam nulos, retorna a literal
select coalesce(null, null, 'TesteCoalesce') Teste from dual;
Nessa função você pode incluir quantas colunas forem necessárias, caso todas estejam nulas, a
função retornara o ultimo parâmetro informado, no exemplo abaixo inclui varios parametros nulos p/ deixar bem claro os testes da função.
select coalesce(null, null, null,
null, null, null,
null, 'TesteCoalesce') Teste
from dual;
Note no exemplo abaixo que se um dos dados não estiver nulo, a função retornará o primeiro valor que encontrar.
select coalesce('C', null, null,
'B', null, null,
'A', 'TesteCoalesce') Teste
from dual;
NULLIF
A função NULLIF retornará null caso os parâmetros informados estejam iguais, sempre que forem diferentes, a função retornará o primeiro parâmetro informado, exemplo:
select Nullif('A', 'A') Teste1
,Nullif('B', 'C') Teste2
,Nullif('C', 'D') Teste3
,Nullif('D', 'D') Teste4
from dual;
CASE
Se trata de uma função onde é possível trabalharmos com estruturas de decisões, como se incluíssemos uma estrutura de IF dentro do select, no exemplo abaixo, inclui uma estrutura de decisão p/ manipular os dados da coluna vl_salario, dependendo da data de contratação, adicionei um valor de aumento de salario.
select nm_func
,dt_contratacao
,vl_salario
,case
when dt_contratacao between to_date('01/01/2017','dd/mm/rrrr')
and to_date('31/12/2017','dd/mm/rrrr') then
vl_salario * 1.10
when dt_contratacao between to_date('01/01/2018','dd/mm/rrrr')
and to_date('31/12/2018','dd/mm/rrrr') then
vl_salario * 1.05
when dt_contratacao between to_date('01/01/2019','dd/mm/rrrr')
and to_date('31/12/2019','dd/mm/rrrr') then
vl_salario * 1.03
else
vl_salario
end vl_ajuste_salario
from funcionarios;
Estrutura do CASE - WHEN - THEN - ELSE - END.
CASE - Abre a estrutura.
WHEN - Quando (Condição)
THEN - Então (O que deve ser feito, caso entre na condição)
ELSE - Exceção das condições anteriores.
END - Fecha a estrutura
DECODE
Também se trata de uma função onde é possível se trabalhar c/ estruturas de decisões, porém no meu ponto de vista p/ atender necessidades menos complexas, as quais eu utilizaria o CASE p/ resolver.
No exemplo abaixo eu estou manipulando o campo tp_instrumento e retornando um numero no meu select de acordo com a literal recuperada da coluna.
select nm_instrumento,
tp_instrumento,
decode(tp_instrumento,
'Corda', 1,
'Percussão', 2,
'Digital', 3,
'Aerofone', 4,
'Sopro', 5,
6) teste_decode
from instr_musicais
No caso do DECODE, o ultimo cadastro na função será a sua exceção, no exemplo acima foi o número 6.
Utilizando o case p/ efetuar o mesmo tratamento de coluna do ultimo exemplo.
select nm_instrumento,
tp_instrumento,
case
when tp_instrumento = 'Corda' then
1
when tp_instrumento = 'Percussão' then
2
when tp_instrumento = 'Digital' then
3
when tp_instrumento = 'Aerofone' then
4
when tp_instrumento = 'Sopro' then
5
else
6
end teste_decode
from instr_musicais
Não creio que para o exemplo em questão exista codificação melhor ou pior em relação ao uso do CASE ou do DECODE, o que vai determinar qual será utilizado será sua demanda/ o que for mais confortável pra você.
Um abraço e espero que tenham gostado.
Leonardo Silva
Nenhum comentário:
Postar um comentário