Tema: If MySql
Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/08/2010, 07:58
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: If MySql

Cita:
Esta consulta anda lo mas bien espeto la parte del if, lo que deseo hacer es que si “@Prim = TRUE” pase el valor de @TEM a el alias Pla_Des1 y además necesito que ase valor “@Prim= false” es decir realizar varias operaciones como se puede hacer en los lenguajes de programación.
Primer error: EL SQL no es un lenguaje de programación. Si alguien te dijo eso, te mintió.
El SQL es un lenguaje de consultas, y lo que tiene son algunas extensiones (que varían en cada DBMS que permiten hacer cosas que no estaban comprendidas en el estandar ANSI-SQL, simplemente para facilitar la vida de los DBA.

Respecto al código, tu problema es de simple resolución: No puedes poner dos operaciones simultáneas o consecutivas como consecuencia del mismo resultado TRUE o FALSE de un IF().
Eso no te lo permite SQL y tampoco te lo permite ningún lenguaje de programación, porque estás confundiendo IF() con IF... THEN...ELSE... IF() es una función, no un controlador de flujo, por eso mismo no acepta múltiples sentencias en cada salida.
Su equivalente, por ejemplo en .Net es IIF(value, True, False), que tampoco te acepta múltiples operaciones en el resultado de value.
Para usar IF... THEN...ELSE... como controlador de flujo debes hacerlo en un script o en un Stored Procedure, y no en una consulta.

Para resolver el problema de las dos operaciones, la sintaxis (simplificada) debería ser:
Código MySQL:
Ver original
  1.   BolP_Num,
  2.   Cli_Nom,
  3.   BolP_CanA,
  4.   Esp_Nom,
  5.   BolP_PreU,
  6.   IF(@Prim = TRUE, @TEM:=Pla_Des, NULL) Pla_Des,
  7.   IF(@Prim = TRUE, @Prim:=TRUE, NULL) Pla_Des2
  8.   (SELECT
  9.     B.*,
  10.     E.Esp_Nom,
  11.     C.Cli_Nom,
  12.     Pla_Dia,
  13.     Pla_Des,
  14.     Pla_Tip
  15.   FROM
  16.     boletap B INNER JOIN
  17.     plazo P ON B.Pla_Num = P.Pla_Num INNER JOIN
  18.     cliente C ON B.Com_Num = C.Cli_Num INNER JOIN
  19.     especies E ON B.Esp_Num = E.Esp_Num ) as LineaBol
  20. ORDER BY Pla_Dia DESC;
Ahora bien, esas dos operaciones tienen un problema: La segunda es irrelevante porque jamás, en ningún momento la variable @Prim cambia su valor, por lo que no se necesita.
Código MySQL:
Ver original
  1.   BolP_Num,
  2.   Cli_Nom,
  3.   BolP_CanA,
  4.   Esp_Nom,
  5.   BolP_PreU,
  6.   IF(@Prim = TRUE, @TEM:=Pla_Des, NULL) Pla_Des
  7.   (SELECT
  8.     B.*,
  9.     E.Esp_Nom,
  10.     C.Cli_Nom,
  11.     Pla_Dia,
  12.     Pla_Des,
  13.     Pla_Tip
  14.   FROM
  15.     boletap B INNER JOIN
  16.     plazo P ON B.Pla_Num = P.Pla_Num INNER JOIN
  17.     cliente C ON B.Com_Num = C.Cli_Num INNER JOIN
  18.     especies E ON B.Esp_Num = E.Esp_Num ) as LineaBol
  19. ORDER BY Pla_Dia DESC;
Además, el uso mismo de las variables no se comprende, poerque lo mismo daría resultado poniendo así:
Código MySQL:
Ver original
  1.   BolP_Num,
  2.   Cli_Nom,
  3.   BolP_CanA,
  4.   Esp_Nom,
  5.   BolP_PreU,
  6.   IF(@Prim, Pla_Des, NULL) Pla_Des
  7.   (SELECT
  8.     B.*,
  9.     E.Esp_Nom,
  10.     C.Cli_Nom,
  11.     Pla_Dia,
  12.     Pla_Des,
  13.     Pla_Tip
  14.   FROM
  15.     boletap B INNER JOIN
  16.     plazo P ON B.Pla_Num = P.Pla_Num INNER JOIN
  17.     cliente C ON B.Com_Num = C.Cli_Num INNER JOIN
  18.     especies E ON B.Esp_Num = E.Esp_Num ) as LineaBol
  19. ORDER BY Pla_Dia DESC;
Especialmente teniendo en cuenta que esa variable @TEM va cambiando su valor en cada registro leído, por lo que al final de la ejecución sólo conservará el último obtenido...

El conjunto entero de la consulta no me resulta comprensible, no comprendo cuál es la necesidad de esas variable.

¿Podrías explicar un poco mejor la idea de lo que quieres obtener?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)