Anuncios en tutorial de programación PLSQL

miércoles, 31 de enero de 2018

Sentencia CASE en PL/SQL de Oracle

La sentencia CASE en PLSQL y un chiste de ordenadores y ratonesLas versiones de base de datos Oracle 9i y posteriores incluyen la posibilidad de utilizar la sentencia CASE dentro de una sentencia SQL (SELECT, UPDATE, etcétera). La sentencia CASE permite realizar las mismas operaciones que las sentencias de control PL/SQL IF-THEN-ELSIF-ELSE pero con la particularidad de que pueden utilizarse dentro de una sentencia SQL. La sintaxis de la sentencia CASE es como sigue:



CASE  [ expresion ]
WHEN condicion_1 THEN resultado_1
WHEN condicion_2 THEN resultado_2
...
WHEN condicion_n THEN resultado_n
ELSE resultado
END

La opción expresion es opcional. Se trata del valor que estaríamos comparando con la lista de condiciones (condicion_1, condicion_2, ..., condicion_n).

Las condiciones, condicion_1 a condicion_n, son analizadas en el mismo orden en que aparecen listadas y, en el momento en que una de estas condiciones se cumple como verdadera, la sentencia CASE devuelve el resultado correspondiente y deja de analizar el resto de condiciones.

Los resultados, resultado_1 a resultado_n, deben ser todos del mismo tipo de dato PLSQL. Son los valores que devuelve la sentencia CASE en el momento en que una condición se cumple como verdadera.

Si ninguna de la condiciones se cumple como verdadera, entonces la sentencia CASE devuelve el valor de la cláusula ELSE. Si la cláusula ELSE se omite y ninguna condición se cumple como verdadera, entonces la sentencia CASE devuelve el valor NULL.

En una sentencia CASE puede haber hasta 255 cláusulas WHEN-THEN-ELSE, por lo tanto podremos construir hasta 128 comparaciones.

A continuación podéis ver un par de ejemplos de sentencia SELECT que incluyen una sentencia CASE:

SELECT apellido, 
CASE nombre
WHEN 'Pepe' THEN 'se llama Pepe'
WHEN 'Juan' THEN 'se llama Juan'
ELSE 'no se llama ni Pepe, ni Juan'
END
FROM empleados;

SELECT apellido, 
CASE
WHEN nombre = 'Pepe' THEN 'se llama Pepe'
WHEN nombre = 'Juan' THEN 'se llama Juan'
ELSE 'no se llama ni Pepe, ni Juan'
END
FROM empleados;

Ambas sentencias SQL devolverán los mismo resultados aunque la segunda sentencia se ha escrito si utilizar la opción expresion.

La sentencia CASE admite múltiples combinaciones, por ejemplo se puede utilizar más de un campo y las condiciones que se pueden contruir pueden ser todo lo complejas que se nos ocurra. Veamos otro ejemplo:

SELECT apellido, nombre,
CASE
WHEN salario > pago_especie
AND apellido < 'P' THEN 'es rico'
WHEN salario < pago_especie
AND apellido >= 'Q' THEN 'es pobre'
ELSE 'no es ni pobre ni rico'
END
FROM empleados;

En nuestro ejemplo resultaría que los empleados cuyo salarío fuera mayor que lo que reciben en especie y cuyo nombre empezase por una letra de la A a la O, serían considerados ricos, los empleados cuyo salarío fuera menor que lo que reciben en especie y cuyo nombre empezase por una letra de la Q a la Z, serían considerados pobres, y el resto de los empleados no serían considerados ni ricos ni pobres.

Artículos relacionados:
La sentencia MERGE en PL/SQL.
La cláusula PIVOT en PLSQL.
La cláusula WITH en PL/SQL.

4 comentarios:

Olga(madre Álvaro) dijo...

Muchas gracias por el blog.

Tengo una pregunta respecto al Case, siempre me han dicho que poner funciones dentro de la Select es un mayor coste, este también sería el caso? No sería preferible evaluar la expresión fuera de la Select?

Muchas gracias

Pepelu dijo...

Hola Olga, obviamente todo lo que metas dentro del SELECT va a ralentizar la ejecución del mismo, pero no tiene por qué ser preferible sacar el CASE del SELECT. Si al final vamos a tener que realizar la comparación (o vamos a tener que ejecutar la función) para todos los registros que devuelva el SELECT, el rendimiento en uno y otro caso va a ser similar.

J m dijo...

¿Se puede usar esta sentencia (CASE) dentro de una INSERT?

Pepelu dijo...

Hola J M, puedes utilizar un INSERT INTO ... SELECT y dentro del SELECT utilizar una cláusula CASE.