Estructuras condicionales en MySQL con la sentencia CASE

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.