sexta-feira, 14 de novembro de 2014

Funções Gerais

As Funções Gerais são funções de linha que você pode utilizar com qualquer tipo de dados. As mais utilizadas são:

  • NVL(entrada, saída_se_null);
  • NVL2(entrada, saída_se_não_null, saída_se_null);
  • NULLIF(entrada_1, entrada_2);
  • COALESCE(entrada_1, entrada_2, ..., entrada_n).

DEFINIÇÕES


A função NVL(entrada, saída_se_null) recebe o parâmetro de entrada e caso o seu valor seja null ela retorna saída_se_null, que pode ser um valor literal ou uma expressão e até mesmo uma outra coluna. Essa função é muito importante ao realizar operações aritméticas entre colunas, pois se um número é aritmeticamente manipulado com valores nulos o resultado será um null e não um número. Caso a coluna ou variável ou expressão utilizada na operação não garanta que os valores serão todos não-nulos, você pode utilizar a função NVL para definir qual valor deverá ser considerado ao invés de null. O tipo retornado da função NVL será sempre o mesmo tipo da entrada.

A função NVL2(entrada, saída_se_não_null, saída_se_null) recebe o parâmetro entrada e realiza o tratamento, caso ele não seja null ou not null, ao contrário da NVL, que só trata os valores null. Se o valor de entrada for não-nulo, será retornado a expressão, valor ou coluna especificada em saída_se_não_null, caso contrário (sendo nulo) o valor que será retornado será a expressão, valor ou coluna especificada em saída_se_null.

A função NULLIF(entrada_1, entrada_2) compara os parâmetros entrada_1 e entrada_2 referente a sua igualdade, se esses valores forem igual a função retorna null, caso contrário entrada_1 será retornado, lembrando que avalia a igualdade também de strings de caractere, não apenas números.

A função COALESCE(entrada_1, entrada_2, ..., entrada_n) retorna o valor do primeiro parâmetro não-nulo, todas as entradas são do mesmo tipo de dados.

EXEMPLOS

O primeiro exemplo é a respeito da utilização das funções NVL e NVL2 (clique na imagem para ampliar):



Considerações:
  • Você pode observar que a utilização do NVL na coluna ENDERECO fez com que ao invés da consulta exibir null nos endereços não cadastrados, exibisse a string 'FUNC SEM ENDERECO CADASTRADO', coluna que chamei de END_NVL;
  • A NVL2 foi utilizada para classificar se o endereço cadastrado está ou não completo (null ou not null respectivamente);
  • Coloquei um exemplo do tipo de erro que pode ocorrer ao se trabalhar com valores nulos em expressões aritméticas, na coluna que nomeei de SAL_PLUS_COMISSAO, nós temos o salário do funcionário somado ao valor real da sua comissão, a coluna VAL_COMISSAO_PERC contém o valor da porcentagem da comissão do funcionário, sendo que alguns não recebem comissão, estando esse campo null para esses colaboradores. Isso faz com que o resultado do salário do empregado que não possui comissão, somado com a comissão null, seja também null, o que não é verdade, o valor tem que ser o próprio salário sem o "plus" da comissão. A forma certa está na coluna que nomeei de SAL_PLUS_COMISSAO_NVL, que traz o resultado correto para os casos em que o funcionário possui ou não comissão, utilizando o NVL e tratando o percentual de comissão para 0(zero) caso o valor na coluna seja null. Deu para entender? =)
O segundo exemplo é a respeito da utilização das funções COALESCE e NULLIF  (clique na imagem para ampliar):



Considerações:

  • A função COALESCE foi utilizada para recuperar o primeiro telefone não nulo, o que eu chamei de TEL_VALIDO;
  • A função NULLIF foi usada para comparar os campos TELEFONE_1 e TELEFONE_2, como em nenhum dos casos os campos são iguais, o retorno foi o TELEFONE_1, nesse caso cabe uma observação, sabemos que se os valores forem iguais a NULLIF retornará null, você pode ver que alguns registros retornaram null (linhas 1,2 e 5), mas nesse caso o resultado é null não por TELEFONE_1 TELEFONE_2 serem iguais, mas sim pelo fato de TELEFONE_1 ser null, nós poderiamos utilizar a função NVL em conjunto com a NULLIF, para garantir que só retornaria null se os valores das duas colunas fossem realmente iguais.
É isso. Espero ter ajudado!

Nenhum comentário:

Postar um comentário