Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

duda con case en funcion mysql

Estas en el tema de duda con case en funcion mysql en el foro de Mysql en Foros del Web. Tengo el siguiente codigo, y al ejectuarla me dice que Error Code : 1339 Case not found for CASE statement (0 ms taken) Pero si ...
  #1 (permalink)  
Antiguo 02/04/2013, 13:09
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Pregunta duda con case en funcion mysql

Tengo el siguiente codigo, y al ejectuarla me dice que

Error Code : 1339
Case not found for CASE statement
(0 ms taken)

Pero si hay

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS `basededatis`.`prueba2`$$
  4.  
  5. CREATE DEFINER=`root`@`localhost` FUNCTION `prueba2`(fecha date, actual date) RETURNS int(2)
  6.    
  7.  declare trimestreactual int(1);
  8.  declare mesfecha int(2);
  9.  declare messig int(2);
  10.  
  11.     set trimestreactual = quarter(actual);
  12.     set mesfecha = month(fecha);
  13.  
  14.  
  15.  
  16. case mesfecha
  17.  
  18.   case trimestreactual
  19.        when 1 then set messig = 4;
  20.        when 2 then set messig = 7;
  21.        when 3 then set messig = 10;
  22.        when 4 then set messig = 1;
  23.    end case;
  24.  
  25.  
  26.   case trimestreactual
  27.        when 1 then set messig = 5;
  28.        when 2 then set messig = 8;
  29.        when 3 then set messig = 11;
  30.        when 4 then set messig = 2;
  31.     end case;
  32.  
  33.  case trimestreactual
  34.        when 1 then set messig = 6;
  35.        when 2 then set messig = 9;
  36.        when 3 then set messig = 12;
  37.        when 4 then set messig = 3;
  38.  
  39.    end case;
  40.  
  41.  case trimestreactual
  42.        when 1 then set messig = 1;
  43.        when 2 then set messig = 4;
  44.        when 3 then set messig = 7;
  45.        when 4 then set messig = 10;
  46.  
  47.    end case;
  48.  
  49.  
  50.  
  51. return messig;
  52. END$$
  53.  
  54. DELIMITER ;
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp

Última edición por gnzsoloyo; 02/04/2013 a las 16:13 Razón: SQL mal etiquetado.
  #2 (permalink)  
Antiguo 02/04/2013, 13:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: duda con case en funcion mysql

Hola jolie_girl:

Tu código no tienen ningún problema, es posible que hayas copiado mál el código, o que en alguno de los renglones tengas algún caracter especial que esté provocando el error... Este es tu código, eliminando sólo los espacios:

Código MySQL:
Ver original
  1. mysql> DELIMITER $$
  2. mysql> DROP FUNCTION IF EXISTS `prueba2`$$
  3. Query OK, 0 rows affected (0.04 sec)
  4.  
  5. mysql> CREATE DEFINER=`root`@`localhost` FUNCTION `prueba2`
  6.     -> (fecha DATE, actual DATE) RETURNS INT(2)
  7.     -> BEGIN
  8.     ->   DECLARE trimestreactual INT(1);
  9.     ->   DECLARE mesfecha INT(2);
  10.     ->   DECLARE messig INT(2);
  11.     ->   SET trimestreactual = QUARTER(actual);
  12.     ->   SET mesfecha = MONTH(fecha);
  13.     ->   CASE mesfecha
  14.     ->     WHEN 1 THEN
  15.     ->       CASE trimestreactual
  16.     ->         WHEN 1 THEN SET messig = 4;
  17.     ->         WHEN 2 THEN SET messig = 7;
  18.     ->         WHEN 3 THEN SET messig = 10;
  19.     ->         WHEN 4 THEN SET messig = 1;
  20.     ->       END CASE;
  21.     ->     WHEN 2 THEN
  22.     ->       CASE trimestreactual
  23.     ->         WHEN 1 THEN SET messig = 5;
  24.     ->         WHEN 2 THEN SET messig = 8;
  25.     ->         WHEN 3 THEN SET messig = 11;
  26.     ->         WHEN 4 THEN SET messig = 2;
  27.     ->       END CASE;
  28.     ->     WHEN 3 THEN
  29.     ->       CASE trimestreactual
  30.     ->         WHEN 1 THEN SET messig = 6;
  31.     ->         WHEN 2 THEN SET messig = 9;
  32.     ->         WHEN 3 THEN SET messig = 12;
  33.     ->         WHEN 4 THEN SET messig = 3;
  34.     ->       END CASE;
  35.     ->     WHEN 4 THEN
  36.     ->       CASE trimestreactual
  37.     ->         WHEN 1 THEN SET messig = 1;
  38.     ->         WHEN 2 THEN SET messig = 4;
  39.     ->         WHEN 3 THEN SET messig = 7;
  40.     ->         WHEN 4 THEN SET messig = 10;
  41.     ->       END CASE;
  42.     ->     END CASE;
  43.     ->   RETURN messig;
  44.     -> END$$
  45. Query OK, 0 rows affected (0.00 sec)
  46.  
  47. mysql> DELIMITER ;
  48. mysql> SELECT `prueba2`(curdate(), curdate());
  49. +---------------------------------+
  50. | `prueba2`(curdate(), curdate()) |
  51. +---------------------------------+
  52. |                               4 |
  53. +---------------------------------+
  54. 1 row in set (0.00 sec)

Revisa eso de los espacios al final, es muy común que se copie basura cuando haces COPY-PASTE

saludos
Leo.
  #3 (permalink)  
Antiguo 02/04/2013, 15:52
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Exclamación Estructura if en funcion mysql como usar OR y varias condiciones

Disculpen otra vez pero no encuentro en internet un ejemplo de lo que quiero tengo este case

case mesfecha
when 1 then if (mesactual > 0 AND mesactual <4) then set messig = 4;
when 2 then if (mesactual > 3 AND mesactual <7) then set messig = 7;

end case;


Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'when 2 then if (mesactual > 3 AND mesactual < 7) then set messig = 7;



luego ya probe con la palabra OR y ||


when 1 then if (mesactual ==1 OR mesactual ==2 OR mesactual ==3) then set messig = 4;

y nada
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp
  #4 (permalink)  
Antiguo 02/04/2013, 16:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda con case en funcion mysql

joile_girl: No abras temas del mismo tipo de asunto, ni en el mismo foro, ni en foros distintos. Nos obligarás a fusionarlos (como ahora) o a borrar el último.
Esto está claramente indicado en las Políticas de Uso de FDW.

Por otro lado, por favor, etiqueta correctamente los códigos. Para eso está el combo "Highlight" en la herramienta de edición.

Finalmente, quisiera que me explicases más claramente qué es lo que se supone que quieres obtener en esa SF. Puede que haya mejores maneras de lograrlo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/04/2013, 16:24
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: duda con case en funcion mysql

Hola, no es del mismo tipo, es una duda sencilla simplemente quiero poner

if (mesactual > 0 AND mesactual <4) then set messig = 4;

pero no funciona, la sintaxis ya busque y no me queda clara, poner varias condiciones en un if, ya hice de todas las formas posibles y saca error
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp
  #6 (permalink)  
Antiguo 02/04/2013, 16:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda con case en funcion mysql

Respondeme la última pregunta...
A mi entender lo que estás haciendo parece innecesariamente complicado, pero para estar seguro necesito saber qué se supone qu ees lo que quieres hacer.

PD: :La función IF() no tiene el THEN como lo escribes, y no se puede usar para una asignación de esa forma.

PD 2: de todos modos estabas tratando el mismo tema básico, por lo que bien podrías haber extendido el post para pedir esa aclaración. No necesitabas abrir un thread nuevo para eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 02/04/2013, 16:38
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: duda con case en funcion mysql

porque en base a una fecha tengo que sacar fecha de c/ 3 meses por ejemplo si ahorita tengo una fecha que es 1 enero, el trimestre es ahorita 1 abril, pero ya paso, el que tengo que mostrar es 1 julio, me explico?, y asi, dependiendo del mes actual, y no creo que sea el mismo tema, el otro era sobre case y este es sobre estructura if, entonces quiero saber como es la sintaxis de if, no encuentro ejemplos de if con varias condiciones lleva parentesis, no lleva? como es Or?, como es and?... no encuentro por ningun lado ( y el case que hice al principio esta mal, no esta bien ese algoritmo, el agoritmo ya lo corregi ahora ya lo tengo bien, pero falta eso de la sintaxis del if)
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp
  #8 (permalink)  
Antiguo 02/04/2013, 16:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda con case en funcion mysql

Primero: Respira. Cálmate al escribir, y por sobre todo, no te olvides de los puntos y puntos aparte. Estás escribiendo como desesperada y resulta difícil entender lo que dices.
Segundo, existen innumerables ejemplos en la web, pero lo primero que deberías leer sería el manual de referencia (no entiendo por que a nadie parece ocurrírsele algo tan simple como eso)...
Si lo lees, verás que la sintaxis del IF es otra, y también verás que no puedes hacer asignaciones con eso, porque SET no es cláusula de la función:
Cita:
IF(expr1, expr2, expr3)

Si expr1 es TRUE (expr1 <> 0 and expr1 <> NULL) entonces IF() retorna expr2; de otro modo retorna expr3. IF() retorna un valor numérico o cadena de caracteres, en función del contexto en que se usa.

Código MySQL:
Ver original
  1. mysql> SELECT IF(1>2,2,3);
  2.         -> 3
  3. mysql> SELECT IF(1<2,'yes','no');
  4.         -> 'yes'
  5. mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
  6.         -> 'no'

Si sólo una de expr2 o expr3 es explícitamente NULL, el tipo del resultado de la función IF() es el mismo tipo que la expresión no NULL .
El bloque de expr1 puede ser cualquier conjunto de condiciones lógicas, siempre que tenga por resultado o TRUE o FALSE. Incluso admite el uso de otras funciones adentro, en tanto sean de una condición tal.
En esencia, puedes usarlo para hacer algo como.
Código MySQL:
Ver original
  1. SET variable = IF( valor IN(valor1, valor2, valor3), siTrue, siFalse);

Ahora bien, en referencia a los primeros posts, desde ya te digo, que tal como lo describes, la SF que pueda hacer eso requeriría, no demasiadas líneas, y usaría un codigo muchísimo más simple que el que escribiste.
Es decir, si, hay modos mejores de lograrlo.

Cita:
no esta bien ese algoritmo, el agoritmo ya lo corregi ahora ya lo tengo bien
Algoritmos tienen los lenguajes de programación, no el SQL. En SQL no hablamos de algoritmos, ni siquiera con el PL/SQL, sino de sintaxis de consultas, optimización, y otros términos, pero no algoritmo.
De hecho, los algoritmos del motor de BBDD son inaccesibles a los programadores, porque están en el kernel del DBMS.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 02/04/2013, 17:10
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: duda con case en funcion mysql

Ah ok, gracias por tu respuesta, pero la estoy poniendo en un procedimiento,¿Es igual?, pl/sql

if (mesactual >= 4 && mesactual <=6) set messig = 7;

ahi sale error, tengo ejemplos en procedimientos que usan la palabra then..
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp
  #10 (permalink)  
Antiguo 02/04/2013, 17:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda con case en funcion mysql

El PL/SQL no está estandarizado. Lo que se usa en un DBMS (Oracle, por ejemplo), no sirve para los demás. No son portables.

Como te dije, ese modo de escribirlo no sirve en MySQL. Y ya te di un ejemplo de cómo usarla. Por lo visto ni lo miraste.



Yo te sugeriría que la SF la pruebes mas o menos parecida a esto:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS `basededatis`.`prueba2`$$
  4.  
  5. CREATE DEFINER=`root`@`localhost` FUNCTION `prueba2`(fecha DATE, actual DATE) RETURNS INT
  6.     IF DAY(fecha)>=DAY(CURDATE()) THEN
  7.         RETURN MONTH(ADDDATE(fecha, INTERVAL 6 MONTH));
  8.     ELSE
  9.         RETURN MONTH(ADDDATE(fecha, INTERVAL 3 MONTH));
  10.     END IF;
  11. END$$
  12.  
  13. DELIMITER ;
Dime qué resultado te da (no tengo tu base para probarla).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 02/04/2013, 17:27
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: duda con case en funcion mysql

Si funciona, no me da lo que quiero, pero ya me diste una idea, ahora solo quiero poner en ese if
varias condiciones, ¿Como las pongo? please ayudame

if(diferencia>3 && diferencia<6) then ......
if(diferencia >=6 && diferencia <=9) then........

¿Me explico? ..¿Esta bien el and asi?, me faltan parentesis .. no lleva llaves ??
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp
  #12 (permalink)  
Antiguo 02/04/2013, 17:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda con case en funcion mysql

¿Realmente estás entendiendo?
Si usas la función IF, la cosa es:
Código MySQL:
Ver original
  1. SET variable = IF( condicion, ValorsiTrue, ValorsiFalse);
Es anidable y admite uso de funciones dentro de las condiciones.

Pero si usas la estructura de control de flujo IF.. THEN, la cosa es diferente:
Código MySQL:
Ver original
  1. IF condicion THEN
  2.    ...
  3.    sentencias
  4.    ...
Son cosas totalmente diferentes,.
Esto sale claramente explicado en el manual:
http://dev.mysql.com/doc/refman/5.0/...functions.html
http://dev.mysql.com/doc/refman/5.0/...rocedures.html
http://dev.mysql.com/doc/refman/5.0/...onstructs.html
http://dev.mysql.com/doc/refman/5.0/...statement.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 02/04/2013, 17:50
Avatar de jolie_girl  
Fecha de Ingreso: agosto-2008
Ubicación: mexico
Mensajes: 346
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: duda con case en funcion mysql

AH ok que interesante, si te entiendo todo perfecto, veo que tienes un conocimiento profundo del tema, pero bueno mi pregunta era demasiado mas simple, de hecho solo me faltaba el END IF, yo estaba usando la estructura de control, sin embargo te agradezco bastante tu tiempo, me has ayudado bastante aunque no me hayas respondido directamente, creo que ahora tengo una mejor idea de resolver mi problema, espero que funcione, mañana lo intentaré
__________________
Solicito colaboradoras para proyecto social media largo plazo. Manda mp

Etiquetas: case, condiciones, estructura, funcion, sql, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:50.