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!!

Anuncio publicitario

29 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.

    • 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;

    • 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
      );

  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!…

    • 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.

  4. 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

  5. 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 😦

  6. 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 ( )

Responder a lauralacarra Cancelar la respuesta

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. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.