Usar expresiones condicionales

Funciones comunes

Las funciones comunes se utilizan para manejar valores NULL en una base de datos. El propósito de las funciones de manejo NULL genéricas es reemplazar los valores NULL con un valor alternativo. Echaremos un vistazo rápido a estas características a continuación.

NVL

La función NVL reemplaza NULL con un valor alternativo.

Sintaxis:

NVL( Arg1, replace_with )

Ambos parámetros son obligatorios en la sintaxis. Tenga en cuenta que la función NVL funciona con todos los tipos de datos. Y también que el tipo de datos de la cadena original y el reemplazo deben estar en un estado compatible, es decir, ser el mismo o implícitamente convertible por Oracle.

Si arg1 es un valor de carácter, Oracle convierte la cadena de reemplazo en un tipo de datos compatible con arg1 antes de compararlos y devuelve VARCHAR2 en el juego de caracteres expr1. Si arg1 es numérico, Oracle determina el argumento con la prioridad numérica más alta, convierte implícitamente el otro argumento a este tipo de datos y devuelve ese tipo de datos.

La instrucción SELECT a continuación mostrará «n / a» si el empleado aún no ha sido asignado a ninguna tarea, es decir. JOB_ID es NULL. De lo contrario, se mostrará el JOB_ID real.

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

NVL2

Como una mejora con respecto a NVL, Oracle introdujo una función para reemplazar el valor no solo para los valores de columna NULL, sino también para las columnas NOT NULL. La función NVL2 se puede utilizar para reemplazar un valor NULL alternativo, así como un valor no NULL.

Sintaxis:

NVL2( string1, value_if_NOT_null, value_if_null )

La instrucción SELECT a continuación mostrará «Bench» si el JOB_CODE del empleado es NULL. Para un valor de CÓDIGO DE TRABAJO específico distinto de cero, se mostrará un valor de Trabajo asignado fijo.

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

NULLIF

La función NULLIF compara los dos argumentos expr1 y expr2. Si expr1 y expr2 son iguales, se devuelve NULL; de lo contrario, devuelve expr1. A diferencia de la otra función de manejo NULL, el primer argumento no puede ser NULL.

Sintaxis:

NULLIF (expr1, expr2)

Tenga en cuenta que el primer argumento puede ser una expresión que se evalúe como NULL, pero no puede ser literal NULL. Ambos parámetros son necesarios para que se ejecute la función.

La consulta siguiente devuelve NULL porque ambos valores de entrada, 12, son iguales.

SELECT	NULLIF (12, 12)
FROM DUAL;

Del mismo modo, la consulta siguiente devuelve «SUN» porque ambas cadenas no son iguales.

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

RUEDA

La función COALESCE, una forma más general de NVL, devuelve la primera expresión distinta de cero en una lista de argumentos. Se requieren un mínimo de dos parámetros obligatorios, pero no hay un número máximo de argumentos.

Sintaxis:

COALESCE (expr1, expr2, ... expr_n )

Considere la siguiente consulta SELECT. Selecciona el primer valor distinto de cero introducido en los campos de dirección del empleado.

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

Curiosamente, el trabajo de la función COALESCE es similar a la construcción IF..ELSIF..ENDIF. La consulta anterior se puede reescribir 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;

Funciones condicionales

Oracle proporciona funciones condicionales DECODE y CASE para condicionalizar incluso en una declaración SQL.

Función DECODIFICAR

La función es el equivalente SQL de la instrucción de procedimiento condicional IF..THEN..ELSE. DECODE trabaja con valores / columnas / expresiones de todos los tipos de datos.

Sintaxis:

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

La función DECODIFICAR compara la expresión con cada valor de búsqueda en orden. Si existe igualdad entre la expresión y el argumento de búsqueda, se devuelve un resultado apropiado. Si no se encuentra ninguna coincidencia, se devuelve el valor predeterminado si se especifica, de lo contrario, NULL. En el caso de una discrepancia de compatibilidad de cualquier tipo, Oracle realiza internamente una posible conversión implícita para devolver los resultados.

De hecho, Oracle considera que dos ceros son equivalentes cuando se trata de la función DECODE.

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

DECOD
-----
EQUAL

Si expresión es cero, Oracle devuelve el resultado de la primera búsqueda, que también es cero. El número máximo de componentes en la función DECODIFICAR es 255.

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

Expresión CASE

Las expresiones CASE siguen el mismo concepto que DECODE, pero difieren en sintaxis y uso.

Sintaxis:

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

La búsqueda de Oracle comienza desde la izquierda y se mueve hacia la derecha hasta que encuentra una condición verdadera y luego devuelve su expresión de resultado asociada. Si no se encuentra ninguna condición que sea verdadera y existe una cláusula ELSE, Oracle devuelve el resultado especificado con else. De lo contrario, Oracle devuelve nulo.

El número máximo de argumentos en una expresión CASE es 255. Todas las expresiones cuentan para este límite, incluida la expresión inicial de una expresión CASE simple y una expresión ELSE opcional. Cada par de CUANDO … ENTONCES cuenta como dos argumentos. Para evitar exceder este límite, puede anidar expresiones CASE para que return_expr en sí sea una expresión 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

🚫