Anuncios en tutorial de programación PLSQL

jueves, 28 de julio de 2022

Sentencia CASE en PL/SQL de Oracle

Las 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 sentencia CASE en PLSQL

Enlos ejemplos que veréis a continuación entederéis rápidamente la gran utilidad de dicha sentencia. 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.

7 comentarios:

Olga 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

JLPM 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?

JLPM dijo...

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

Juan dijo...

hola se puede usar el case con una condicion de letra
por ejemplo
nombre pedro y yo en el case le de una condicion con p

como tendria que hacerlo me podrias dar un ejemplo ?

Gabriel GRG dijo...

Amigo, puedo usar un CASE en un UPDATE en PL-SQL ??
Tengo esta consulta en T-SQL y me funciona bien, pero en PL-SQL, no:

update I
SET I.cuenta = case when DF.id_fact is null then '990' else '550' end
from Items I
LEFT join Det_facturas DF on DF.id_item = I.id_item

JLPM dijo...

Hola Gabriel,

La sintaxis de tu comando no es correcta. La sintaxis del UPDATE en PLSQL es:


UPDATE table1
SET column1 = expression1,
column2 = (SELECT expression1
FROM table2
WHERE conditions),
...
column_n = expression_n
[WHERE conditions];

En tu caso entiendo que la forma correcta sería:

UPDATE items i
SET
i.cuenta = (
SELECT
CASE
WHEN df.id_fact IS NULL THEN '990'
ELSE '550'
END
FROM
det_facturas df
WHERE
df.id_item = i.id_item
);