sábado, 3 de outubro de 2020

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Utilizando funções de conversão e condicionais. Cont.

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

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Comando Merge

Fala, galera. Tudo bem? Hoje vou falar um pouco sobre o comando MERGE. O MERGE é um comando DML que combina as funções de insert, update e d...