Ejemplo CASE MySQL

Sabemos la secuencia de la teoría. ¿Pero cómo manejamos una secuencia CASE con un tipo de dato ENUM como value?

CASE value

WHEN [compare-value]

THEN result [WHEN [compare-value] THEN result ...]

[ELSE result] END,

CASE WHEN [condition]

THEN result

[WHEN [condition]THEN result ...]

[ELSE result]

END

Adjunto un ejemplo de secuencia CASE en MySQL, ya que en su día cuando busqué, no encontré un ejemplo claro.

Primero vamos a suponer que tenemos la siguiente base de datos en MySQL centrándonos en los datos que importan: PK y ENUM.

catalog_filter_id —>  la clave (PK)
article_status —> tipo ENUM.
El resto son date, string, etc.

‘article_status’  que es de tipo ENUM está definido de la siguiente forma:

 

ENUM {‘all’,’operative’,’no_operative’}

 

Al ser un enum, article_status puede ser 1, 2, 3.

Si en lugar de 1, 2, 3 como resultado de la búsqueda queremos que devuelva  ‘Todos’, ‘En vigor’ y ‘Sin vigor’:

“En caso de ser 1 muestra ‘Todos’,

En caso de ser 2 muestra ‘En vigor’,

En caso de ser 3 muestra ‘Sin vigor'”

Entonces la secuencia con CASE queda:

SELECT

catalog_filter_id,

family_from,

family_to,

article_from,

article_to,

case article_status  when 1 then 'Todos'  when 2 then 'En vigor'  when 3 then 'Sin vigor'  end as article_status,

bu.name

FROM catalogs_filters cf  left join business_units bu on cf.business_unit_id=bu.business_unit_id


WHERE

cf.catalog_id = ? and

cf.deleted_date is null



Por si no se ve bien en la misma línea tenemos:

case article_status  
  when 1 then 'Todos'  
  when 2 then 'En vigor'  
  when 3 then 'Sin vigor'  
end as article_status

¿Qué conseguimos?

Que se muestren las cadenas ‘Todos’, ‘En vigor’ y ‘Sin vigor’ del CASE en lugar de los números ‘1’, ‘2’, ‘3’ de article_status.

Conclusión: Los ejemplos me liaban si la sentencia ‘case’ va con ‘end’, hay ‘;’ etc. Con este ejemplo si lo utilizas parecido… tiene que funcionar 😉

Fedback, comentarios, pegas, mejoras, compartir y vivir are welcome

Gracias!!

Anuncios

18 comentarios en “Ejemplo CASE MySQL

  1. Por qué no puedo hacer esto?

    Dentro de un Store Procedure, donde “param” es un parámetro del procedimiento?

    DECLARE var1 VARCHAR(10);
    CASE param
    WHEN 1 THEN var1 = `common_join`
    WHEN 2 THEN var1 = `count`
    WHEN 3 THEN var1 = `test_orders`
    WHEN 4 THEN var1 = `test_union`
    ELSE var1 = `common_join`
    END CASE;
    SELECT * FROM var1;

    Al ejecutarlo me marca error de sintaxis en la sentencia CASE.

    1. te falto poner el set

      set var1 = `common_join`

      y lo otro que te falto es

      SET @statement = CONCAT(“SELECT * FROM “, var1,”;”);
      PREPARE myStatement FROM @statement;
      EXECUTE myStatement;
      DEALLOCATE PREPARE myStatement;

  2. Bueno lo tuve que hacer así…

    CASE param
    WHEN 1 THEN SELECT * FROM `common_join`;
    WHEN 2 THEN SELECT * FROM `count`;
    WHEN 3 THEN SELECT * FROM `test_orders`;
    WHEN 4 THEN SELECT * FROM `test_union`;
    ELSE SELECT * FROM `common_join`;
    END CASE;

    De cualquier forma Gracias y muy buena tu explicación del uso de CASE!…

    1. Hola JLuis!!

      Gracias por tus comentarios.

      1º La sintaxis de la secuencia CASE
      La sintaxis de la expresión dice THEN result y por lo tanto tiene que ser una lógica que devuelva un valor o una lista de valores. La utilización de una asignación me resulta chocante.
      2º Utilización de una variable para hacer un select: SELECT * FROM var1;
      Tengo que hacer una prueba pero dudo que se pueda hacer. “A saber qué está guardado MySQL por debajo”. Voy a hacer una prueba!

      Muchas gracias por compartir luego la solución!! Compartimos conocimiento y aprendemos entre todos 🙂

  3. Hola necesito una GRAN AYUDA para mi tesis. es en la parte de STOCK.
    mi idea es ingresar dos fechas y que muestre algunos datos y que compare dos resultados y dependiendo el total me tiene que mostrar una palabra en otra columna.
    el sql que tengo es asi:

    SELECT detallefactura.idProducto, producto.nomProducto,producto.fechaProducto, producto.stockIngresado, producto.stockActual,SUM(detallefactura.cantidad), (producto.stockActual+SUM(detallefactura.cantidad))-producto.stockIngresado

    FROM detalleFactura, producto

    WHERE detallefactura.idProducto=producto.idProducto AND producto.fechaProducto >= ‘2016-09-01’ and producto.fechaProducto <= '2016-09-30'

    GROUP BY detallefactura.idProducto

    TIENE QUE COMPARAR EL STOCK.INGRESADO CON LA SUMA DE PRODUCTO.ACTUAL Y DETALLE.CANTIDAD, SI EL RESULTADO ES 0 ME TIENE QUE MOSTRAR UNA PALBARA SI ES NEGATIVO OTRA Y SI ES UN NUMERO POSITIVO OTRA.

    me podrian ayudar?? muchas gracias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s