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!!
Gracias me funciono correctamente 😉 muy buen aporte
¡A mi también me ha servido muchísimo!
Gracias de verdad.
Gracias! Si véis que no está claro o necesita más explicación me lo comentáis. Un saludo!
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.
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;
Hola! muy interesante!! eso es para hacerlo como Store Procedure, no?
Espero y te sirva es parecido a lo que quieres hacer. Tienes que asignar el valor despues de realizar el case>
SET Mes = (
CASE NumMes
WHEN 1 THEN
‘ENERO’
WHEN 2 THEN
‘FEBRERO’
WHEN 3 THEN
‘MARZO’
WHEN 4 THEN
‘ABRIL’
WHEN 5 THEN
‘MAYO’
WHEN 6 THEN
‘JUNIO’
WHEN 7 THEN
‘JULIO’
WHEN 8 THEN
‘AGOSTO’
WHEN 9 THEN
‘SEPTIEMBRE’
WHEN 10 THEN
‘OCTUBRE’
WHEN 11 THEN
‘NOVIEMBRE’
WHEN 12 THEN
‘DICIEMBRE’
END
);
Espero y te sirva es parecido a lo que quieres hacer. Tienes que asignar el valor despues de realizar el case>
SET Mes = (
CASE NumMes
WHEN 1 THEN
‘ENERO’
WHEN 2 THEN
‘FEBRERO’
WHEN 3 THEN
‘MARZO’
WHEN 4 THEN
‘ABRIL’
WHEN 5 THEN
‘MAYO’
WHEN 6 THEN
‘JUNIO’
WHEN 7 THEN
‘JULIO’
WHEN 8 THEN
‘AGOSTO’
WHEN 9 THEN
‘SEPTIEMBRE’
WHEN 10 THEN
‘OCTUBRE’
WHEN 11 THEN
‘NOVIEMBRE’
WHEN 12 THEN
‘DICIEMBRE’
END
);
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!…
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 🙂
Muchas gracias por compartir tus dudas y solución 🙂 Perdona que no contestara a tiempo.
Muchas gracias, excelente explicación y funciona al 100%
Gran aporte, muchas gracias
Muchas gracias por tu comentario! Un saludo
Gracias por el aporte.
Gracias por tu post!
Excelente gracias
Gracias 🙂
Muchas gracias por comentar, ayuda a mejorar 🙂
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.
Una forma mas facil de hacer lo de su ejemplo. (Esto en mysql)
SELECT ELT(3,’lunes’,’martes’,’miercoles’,’jueves’,’viernes’)
=> miercoles
SELECT ELT(5,’lunes’,’martes’,’miercoles’,’jueves’,’viernes’)
=> viernes
Pueden ser maaaaas especificos
hola Jesús! dices de poner un ejemplo más específico? gracias
Excelente articulo! Fue de mucha ayuda, gracias!
Explicado de manera sencilla y útil. Gracias
Buenos Días Laura muy bueno tu aporte al conocimiento te felicito como persona y como profesional del área
muchas gracias!! me alegra que aún sirva este post en el 2020! Gracias