Uso de diferentes views según criterio

Estoy preparando la vista de aptitudes para una escuela de idiomas y los criterios de valoración han cambiado de un año a otro. EL año pasado (el primero con este sistema) se creado una vista y devolvía si un alumno era apto o no en función de unos criterios, compensaciones, etc. Este año estos compensaciones y criterios han cambiado y es posible que vuelva a hacerlo en el futuro. Podría meterlo todo dentro del SELECT con sentencias IF, pero no me parece nada limpio. Lo ideal sería (que dudo que se pueda hacer) algo del tipo:

SELECT * 
FROM SWITCH(year)
    CASE 2011:
        view2011;
    CASE 2012
        View 2012;

Esto dudo que pueda hacerse, ¿se te ocurre alguna otra forma de hacerlo?

1 Respuesta

Respuesta
1

Puede hacerse de una forma muy parecida a lo que pones de ejemplo, usando los stored procedures de MySQL. ¿Deseas algunas explicaciones sobre ellos?

Procedimientos almacenados? Si me puedes dar alguna noción de por donde tirar te lo agradecería.

En mi respuesta anterior).

El siguiente ejemplo funciona, lo he probado pues las vistas que aparecen (f13, f13w, f12w) pertenecen a un sistema real en producción, y ya estoy pensando en utilizarlo realmente dentro del proyecto :)

DROP PROCEDURE aptitudes;
DELIMITER $$
CREATE PROCEDURE aptitudes (IN theYear INT)
BEGIN 
  CASE theYear
    WHEN 2012 THEN SELECT * FROM f013;
    WHEN 2013 THEN SELECT * FROM f013w;
    ELSE SELECT * FROM f012w;
  END CASE;
END$$
DELIMITER;

El DROP PROCEDURE sirve para quitar de la base de datos el procedimiento. Entonces puedes modificar el código del CREATE y ejecutarlo tantas veces como quieras, borrando y luego creando de nuevo el SP con las modificaciones.

El DELIMITER $$ instruye a MySQL para que a continuación no se considere ; como fin de sentencias sino $$. De lo contrario, al escribir los ; que pertenecen al código del stored procedure, MySQL los ejecutaría inmediatamente.

Luego viene el procedimiento. Se lo crea, se indica el parámetro que usará (IN viene de INPUT)

BEGIN y END delimitan el cuerpo del procedimiento.

CASE ya te imaginas para qué sirve.

Los WHEN sugieres valores posibles, y ejecutan SELECT sobre distintas vistas.

El ELSE te da una respuesta por defecto, si se le pasa un valor no previsto en los WHEN.

El DELIMITER; indica a MySQL que el ; vuelve a su función habitual de delimitar sentencias en la línea de comandos.

La sentencia para ejecutar este SP es CALL (sin SELECT ni nada).

Ej.:

CALL aptitudes(2012);

Y devuelve un conjunto de resultados al igual que SELECT.

Solicita aclaraciones adicionales si necesitas.

Muchísimas gracias! mañana mismo me pongo con ello a intentar implementarlo. Nunca me había tocado trabajar con procedimientos almacenados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas