Usando Expressões Condicionais

Funções Gerais

Funções gerais são usadas para lidar com valores NULL no banco de dados. O objetivo das funções gerais de tratamento de NULL é substituir os valores NULL por um valor alternativo. Veremos resumidamente essas funções a seguir.

NVL

A função NVL substitui um valor alternativo por um valor NULL.

Sintaxe:

NVL( Arg1, replace_with )

Na sintaxe, ambos os parâmetros são obrigatórios. Observe que a função NVL funciona com todos os tipos de tipos de dados. E também que o tipo de dados da string original e a substituição devem estar em estado compatível, ou seja, o mesmo ou implicitamente conversível pelo Oracle.

Se arg1 for um valor de caractere, o oracle converte a string de substituição no tipo de dados compatível com arg1 antes de compará-los e retorna VARCHAR2 no conjunto de caracteres de expr1. Se arg1 for numérico, o Oracle determina o argumento com a precedência numérica mais alta, converte implicitamente o outro argumento para esse tipo de dados e retorna esse tipo de dados.

A instrução SELECT abaixo exibirá 'n / a' se um funcionário ainda não tiver sido atribuído a nenhum trabalho, ou seja, JOB_ID é NULL. Caso contrário, ele exibiria o valor real JOB_ID.

SELECT  first_name, NVL(JOB_ID, 'n/a')
FROM employees;

NVL2

Como um aprimoramento em relação ao NVL, o Oracle introduziu uma função para substituir o valor não apenas para valores de colunas NULL, mas também para colunas NOT NULL. A função NVL2 pode ser usada para substituir um valor alternativo para NULL, bem como um valor não NULL.

Sintaxe:

NVL2( string1, value_if_NOT_null, value_if_null )

A instrução SELECT abaixo exibiria 'Banco' se JOB_CODE para um funcionário fosse NULL. Para um valor definido não nulo de CÓDIGO DE TRABALHO, ele mostraria o valor constante 'Trabalho Atribuído'.

SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;

NULLIF

A função NULLIF compara dois argumentos expr1 e expr2. Se expr1 e expr2 forem iguais, ele retornará NULL; caso contrário, ele retorna expr1. Ao contrário da outra função de tratamento de nulos, o primeiro argumento não pode ser NULL.

Sintaxe:

NULLIF (expr1, expr2)

Observe que o primeiro argumento pode ser uma expressão avaliada como NULL, mas não pode ser o literal NULL. Ambos os parâmetros são obrigatórios para a execução da função.

A consulta abaixo retorna NULL, pois os valores de entrada 12 são iguais.

SELECT	NULLIF (12, 12)
FROM DUAL;

Da mesma forma, a consulta abaixo retorna 'SUN', pois as duas strings não são iguais.

SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;

COALESCE

A função COALESCE, uma forma mais genérica de NVL, retorna a primeira expressão não nula na lista de argumentos. Leva no mínimo dois parâmetros obrigatórios, mas o máximo de argumentos não tem limite.

Sintaxe:

COALESCE (expr1, expr2, ... expr_n )

Considere a consulta SELECT abaixo. Ele seleciona o primeiro valor não nulo alimentado nos campos de endereço de um funcionário.

SELECT COALESCE (address1, address2, address3) Address
FROM  employees;

Curiosamente, o funcionamento da função COALESCE é semelhante à construção IF..ELSIF..ENDIF. A consulta acima pode ser reescrita como -

IF address1 is not null THEN
   result := address1;
ELSIF address2 is not null THEN
   result := address2;
ELSIF address3 is not null THEN
   result := address3;
ELSE
   result := null;
END IF;

Funções Condicionais

O Oracle fornece funções condicionais DECODE e CASE para impor condições até mesmo na instrução SQL.

A função DECODE

A função é a equivalência SQL da instrução procedural condicional IF..THEN..ELSE. DECODE funciona com valores / colunas / expressões de todos os tipos de dados.

Sintaxe:

DECODE (expression, search, result [, search, result]... [, default])

A função DECODE compara a expressão com cada valor de pesquisa em ordem. Se houver igualdade entre a expressão e o argumento de pesquisa, ele retornará o resultado correspondente. Em caso de não correspondência, o valor padrão é retornado, se definido, caso contrário, NULL. No caso de qualquer incompatibilidade de compatibilidade de tipo, o oracle faz internamente uma possível conversão implícita para retornar os resultados.

Na verdade, o Oracle considera dois nulos como equivalentes ao trabalhar com a função DECODE.

SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL') 
FROM DUAL;

DECOD
-----
EQUAL

Se a expressão for nula, o Oracle retornará o resultado da primeira pesquisa, que também é nulo. O número máximo de componentes na função DECODE é 255.

SELECT	first_name, salary, DECODE (hire_date, sysdate,'NEW JOINEE','EMPLOYEE')
	FROM employees;

Expressão CASE

As expressões CASE funcionam com o mesmo conceito que DECODE, mas diferem na sintaxe e no uso.

Sintaxe:

CASE  [ expression ]
   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n
   ELSE result
END

A pesquisa do Oracle começa da esquerda e avança para a direita até encontrar uma condição verdadeira e, em seguida, retorna a expressão de resultado associada a ela. Se nenhuma condição for considerada verdadeira e existir uma cláusula ELSE, o Oracle retornará o resultado definido com else. Caso contrário, o Oracle retorna nulo.

O número máximo de argumentos em uma expressão CASE é 255. Todas as expressões contam para esse limite, incluindo a expressão inicial de uma expressão CASE simples e a expressão ELSE opcional. Cada par WHEN ... THEN conta como dois argumentos. Para evitar exceder esse limite, você pode aninhar expressões CASE para que a própria return_expr seja uma expressão CASE.

SELECT first_name, CASE	WHEN salary < 200 THEN 'GRADE 1'
			WHEN salary > 200 AND salary < 5000 THEN 'GRADE 2'
			ELSE 'GRADE 3'
		   END CASE
FROM employees;	

ENAM    CASE
----    -------
JOHN    GRADE 2
EDWIN   GRADE 3
KING    GRADE 1