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
Estoy apuntito de entender… se me ocurrió hacer una calculadora básica con una única función es decir así más o menos:
create function calculadora (valor1 int, valor2 int, operacion varchar) returns resultado
BEGIN
DECLARE resultado INT;
SET resultado = 0;
SET resultado = num1 +num2;
RETURN resultado;
END; #y así con las demás operaciones
y que al sacar el Select(6,5,+) me muestre el resultado de la suma en este caso….
pero no sé si se pueda usar el case aquí, no lo tengo claro XD me podrían ayudar? disculpen estoy empezando a aprender 😦
hola quisiera que me ayuden con este tipo de case
case
when C.name = ‘(Normal)’ then ‘Normal’
when C.name = ‘(NoPrimVtna)’ then ‘NoPrimVtna’
when C.name = ‘(NoPrimVtna) ESP’ then ‘NoPrimVtna ESP’
when C.name = ‘(Normal) ESP’ then ‘Normal ESP’
when C.name = ‘(Normal) PLY’ then ‘Normal PLY’
ELSE ‘validar’
END ‘TipoVentana’
el valor que se requiere ingresar en el case es con ( )