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

If MySql

Estas en el tema de If MySql en el foro de Mysql en Foros del Web. Tengo la siguiente consulta en MySql @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original use remate ;   SET @TEM = NULL , @Pos = 1 , ...
  #1 (permalink)  
Antiguo 21/08/2010, 08:29
 
Fecha de Ingreso: septiembre-2009
Mensajes: 24
Antigüedad: 14 años, 7 meses
Puntos: 0
If MySql

Tengo la siguiente consulta en MySql

Código MySQL:
Ver original
  1. use remate;
  2.  
  3. SET @TEM = NULL, @Pos=1, @Prim = TRUE;
  4.  
  5. SELECT BolP_Num, Cli_Nom, BolP_CanA, Esp_Nom, BolP_PreU,
  6. IF(@Prim = TRUE,  @TEM:=Pla_Des  @Prim:=true  , null) as Pla_Des1
  7. FROM (SELECT boletap.*, especies.Esp_Nom, cliente.Cli_Nom, Pla_Dia, Pla_Des, Pla_Tip
  8. FROM ((boletap INNER JOIN plazo ON boletap.Pla_Num=plazo.Pla_Num)
  9.  INNER JOIN cliente ON boletap.Com_Num=cliente.Cli_Num)
  10. INNER JOIN especies ON boletap.Esp_Num=especies.Esp_Num ORDER BY Pla_Dia DESC) as LineaBol;

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.
(Por cierto la consulta no esta terminada me tranque hay)
Agradezco cualquier ayuda
  #2 (permalink)  
Antiguo 21/08/2010, 22:38
 
Fecha de Ingreso: agosto-2010
Mensajes: 2
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: If MySql

Yo también tengo un problema con el IF.
Tengo que construir una sentencia que seleccione el campo 'precio' ó 'precio_oferta' en función de si 'oferta<>0', pero no puedo utilizar el recordset para verlo, tiene que estar construida al ejecutarse este.

Bueno, la cosa es que he mirado los manuales y he puesto esto:

select SQL_BIG_RESULT SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS *,(select if (oferta<>0,'precio_oferta','precio')AS precio) from tabla_pruebas WHERE rel_categoria='2' and precio between '5' and '140'


Selecciono todos los campos (hay mogollón) y en función de si es oferta<>0 le doy al campo 'precio' el valor de 'precio' ó 'precio_oferta' para que en la comparativa del where este el valor en función de si es precio de oferta o precio normal.

Perdonad por el rollo, pero no soy un experto en esto y estoy un poco rayao de no saber como hacerlo.

Muchas Gracias.
  #3 (permalink)  
Antiguo 22/08/2010, 07:58
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: 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)
  #4 (permalink)  
Antiguo 22/08/2010, 20:22
 
Fecha de Ingreso: agosto-2010
Mensajes: 2
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: If MySql

Hola gnzsoloyo, no podrías mirar algo de mi código también... necesito ayuda!!!!!

Gracias.
  #5 (permalink)  
Antiguo 22/08/2010, 22:14
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: If MySql

Cita:
Iniciado por joebar27 Ver Mensaje
Hola gnzsoloyo, no podrías mirar algo de mi código también... necesito ayuda!!!!!

Gracias.
Mira, tu sentencia base es:
Código MySQL:
Ver original
  1.   TP.*,
  2.   IF(oferta<>0,`precio_oferta`,`precio`) precio
  3. FROM tabla_pruebas TP
  4. WHERE rel_categoria='2' AND precio BETWEEN 5 AND 140;
Lo que tienes que tener en cuenta es no confundir los apostrofes (') con los acentos inversos (`); los primeros se usan para encerrar cadenas de texto, y los segundos son para los nombres de tablas, campos, bases, etc.; es decir, para nombres de objetos de base de datos.

Por otro lado, la necesidad de usar SQL_BIG_RESULT, SQL_BUFFER_RESULT y SQL_CALC_FOUND_ROWS es relativa. Si trabajas con tablas pequeñas, es innecesario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 27/08/2010, 12:27
 
Fecha de Ingreso: septiembre-2009
Mensajes: 24
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: If MySql

Ola de nuevo lamento dejarte medio colgado “gnzsoloyo” es que esta a full con el trabajo este y me tenia absorbido.
Bueno mi consulta terminada seria la siguiente
Código MySQL:
Ver original
  1. BolP_Num,
  2. Cli_Nom,
  3. BolP_CanA,
  4. Esp_Nom,
  5. BolP_PreU,
  6.  
  7. (@TMP:= BolP_CanA * BolP_PreU) AS BolP_Tpt,
  8. IF (@Prim, (@Dia:= Pla_Dia) + @Prim:= FALSE, NULL),
  9. IF (@Dia <> Pla_Dia, (@Dia:= Pla_Dia) + (@Pos:= @Pos + 1 ), NULL),
  10. IF (@Pos = 1, "" + @TMP, NULL) as BolP_TotP1,
  11. IF (@Pos = 2, "" + @TMP, NULL) as BolP_TotP2,
  12. IF (@Pos = 3, "" + @TMP, NULL) as BolP_TotP3
  13. boletap.*,
  14. especies.Esp_Nom,
  15. cliente.Cli_Nom,
  16. Pla_Dia,
  17. Pla_Des,
  18. Pla_Tip,
  19. @Prim:= true,
  20. @Pos:= 1
  21. (boletap INNER JOIN plazo ON boletap.Pla_Num=plazo.Pla_Num)
  22.  INNER JOIN cliente ON boletap.Com_Num=cliente.Cli_Num)
  23. INNER JOIN especies ON boletap.Esp_Num=especies.Esp_Num WHERE Liq_Ven = $P{Num_Liquidacion}
  24.  
  25. ORDER BY Pla_Dia DESC) as LineaBol

Esta consulta la utiliza para poder realizar un reporte en IReport
te dejo el Linq que te explica un poco mejor el propósito final.


http://www.forosdelweb.com/f45/imprimir-liquidacion-java-834609/#post3524135


Este consulta seria para la parte de listado de lianas.
Aunque esto anda perfectamente no pude utilizar las varales de iReport porque no les pude asignar un valor lo cual a mi entender me hubiera abreviado un poco la consultar si tense información al respecto me serviría mucho en el resto del reporte o en reportes futuros
:::::::Gracias:::::::

Última edición por ary666; 27/08/2010 a las 12:33 Razón: anda mal el enlace

Etiquetas: Ninguno
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 18:02.