Estructuras condicionales en MySQL con la sentencia CASE
Desarrollo Web
La expresión CASE en MySQL es una estructura condicional que permite dotar de una lógica similar a un if-else a un query; Evalúa varias condiciones y retorna un resultado cuando la comparación sea verdadera. Una vez encontrado un valor verdadero deja de comparar y retorna el valor dado, al no encontrar ningún valor verdadero retorna el bloque else, sí no encontrará un bloque else retornará null.
Veamos su sintaxis...
CASE value
WHEN [compare_value] THEN result
WHEN [compare_value] THEN result...
ELSE result
END
Pero como todo es mas fácil con ejemplos veamos un par de ejemplos prácticos...
Supongamos que en nuestra base de datos tenemos una tabla de tomates categorizados, con su cantidad y una unidad de medida...
| id_tomate | categoria | cantidad | unidad |
-------------------------------------------------------------
| 1 | A | 5 | cajas |
-------------------------------------------------------------
| 2 | B | 8 | cajas |
-------------------------------------------------------------
| 3 | C | 6 | kilogramos |
-------------------------------------------------------------
Y ahora deseamos pasar 4 cajas de la categoría B a la A. Es aquí donde podemos aplicar la sentencia case para hacer la operación en un solo paso...
UPDATE tomates
SET cantidad = CASE id_tomate
WHEN 2 THEN 4
WHEN 1 THEN 9
END
WHERE id_tomate in( 1, 2);
Vemos que se va actualizar el campo cantidad de la tabla tomates de las filas con id_tomates 1 y 2, cuando el id_tomate sea dos lo va a actualizar a 4 restando los 4 tomates y cuando sea 1 se va actualizar a 9 agregando los cuatro tomates que tomamos de la categoría B.
Siguiendo con el mismo ejemplo pero si necesitáramos hacerlo de manera dinámica pero desde un lenguaje de programación como php aplicariamos el siguiente código...
$query_conversion = "
UPDATE productos
SET cantidad = CASE id_producto
WHEN $id_producto_origen THEN $cantidad_prods_origen
WHEN $id_producto_conversion THEN $cantidad_prods_conversion
END
WHERE id_producto in( $id_producto_origen, $id_producto_conversion);
";
Es el mismo query pero lo hemos guardado en una variable como un string y le concatenamos un id de producto de origen (que es de donde vamos a quitar productos) con su cantidad de productos total a como va quedar y el caso inverso un id del producto a donde se van sumar los productos con la cantidad respectiva productos.
Otro ejemplo de CASE
Un ejemplo más para que todo sea un poco más claro. Tomando como ejemplo la misma tabla... Supongamos que queremos ver los productos con su cantidad y su unidad de medida, pero en vez de ver toda la palabra de la unidad de medida para kilogramo queremos ver kg y para caja cj entonces ...
SELECT id_tomate, categoria,
CONCAT(cantidad,
CASE unidad
WHEN 'kilogramos' THEN 'kg'
WHEN 'cajas' THEN 'cj'
END
)
from tomates;
Mostramos el id del tomate, su categoría y concatenamos los campos cantidad y unidad, pero en el campo unidad aplicamos nuestra sentencia CASE que según la unidad sustituye kg o cj por el nombre completo de la unidad con un resultado...
| id_tomate | categoria | cantidad |
------------------------------------------------
| 1 | A | 9cj |
------------------------------------------------
| 2 | B | 4cj |
------------------------------------------------
| 3 | C | 6kg |
------------------------------------------------
Y con esto, un par de ejemplos sencillos del uso de la sentencia CASE en MySQL.