Usar expresiones condicionales
Funciones generales
Las funciones generales se utilizan para manejar valores NULL en la base de datos. El objetivo de las funciones generales de manejo de NULL es reemplazar los valores NULL con un valor alternativo. Veremos brevemente estas funciones a continuación.
NVL
La función NVL sustituye un valor alternativo por un valor NULO.
Sintaxis:
NVL( Arg1, replace_with )
En la sintaxis, ambos parámetros son obligatorios. Tenga en cuenta que la función NVL funciona con todo tipo de 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, el mismo o implícitamente convertible por Oracle.
Si arg1 es un valor de carácter, entonces Oracle convierte la cadena de reemplazo al tipo de datos compatible con arg1 antes de compararlos y devuelve VARCHAR2 en el juego de caracteres de expr1. Si arg1 es numérico, Oracle determina el argumento con mayor precedencia numérica, convierte implícitamente el otro argumento a ese tipo de datos y devuelve ese tipo de datos.
La instrucción SELECT a continuación mostrará 'n / a' si un empleado aún no ha sido asignado a ningún trabajo, es decir, JOB_ID es NULL. De lo contrario, mostraría el valor real de JOB_ID.
SELECT first_name, NVL(JOB_ID, 'n/a')
FROM employees;
NVL2
Como una mejora sobre NVL, Oracle introdujo una función para sustituir valor no solo por valores de columnas NULL sino también por columnas NOT NULL. La función NVL2 se puede utilizar para sustituir un valor alternativo para NULL y un valor no NULL.
Sintaxis:
NVL2( string1, value_if_NOT_null, value_if_null )
La instrucción SELECT a continuación mostraría 'Bench' si el JOB_CODE para un empleado es NULL. Para un valor definido no nulo de CÓDIGO DE TRABAJO, mostraría el valor constante 'Trabajo asignado'.
SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;
NULLIF
La función NULLIF compara dos argumentos expr1 y expr2. Si expr1 y expr2 son iguales, devuelve NULL; de lo contrario, devuelve expr1. A diferencia de la otra función de manejo de nulos, 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 el literal NULL. Ambos parámetros son obligatorios para que la función se ejecute.
La siguiente consulta devuelve NULL ya que ambos valores de entrada, 12, son iguales.
SELECT NULLIF (12, 12)
FROM DUAL;
De manera similar, la consulta siguiente devuelve 'SUN' ya que ambas cadenas no son iguales.
SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;
JUNTARSE
La función COALESCE, una forma más genérica de NVL, devuelve la primera expresión no nula en la lista de argumentos. Requiere un mínimo de dos parámetros obligatorios, pero el máximo de argumentos no tiene límite.
Sintaxis:
COALESCE (expr1, expr2, ... expr_n )
Considere la siguiente consulta SELECT. Selecciona el primer valor no nulo introducido en los campos de dirección de un empleado.
SELECT COALESCE (address1, address2, address3) Address
FROM employees;
Curiosamente, el funcionamiento 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 imponer condiciones incluso en declaraciones SQL.
La función DECODIFICAR
La función es la equivalencia SQL de IF..THEN..ELSE instrucción de procedimiento condicional. 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, devuelve el resultado correspondiente. En caso de que no coincida, se devuelve el valor predeterminado, si está definido, en caso contrario, NULL. En caso de que exista alguna discrepancia en la compatibilidad de tipos, Oracle realiza internamente una posible conversión implícita para devolver los resultados.
De hecho, Oracle considera que dos nulos son equivalentes mientras trabaja con la función DECODE.
SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL')
FROM DUAL;
DECOD
-----
EQUAL
Si expresión es nula, Oracle devuelve el resultado de la primera búsqueda que también es nulo. 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 funcionan con 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 la expresión de resultado asociada con ella. Si no se encuentra ninguna condición verdadera y existe una cláusula ELSE, Oracle devuelve el resultado definido 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 la expresión ELSE opcional. Cada par 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