Ver Mensaje Individual
  #7 (permalink)  
Antiguo 28/06/2009, 20:44
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: usando CONCAT

Puede que te parezca muy largo pero es más fácil de programar.
El problema de manipular variables en una sentencia (que sí se puede hacer) es que deben operarse en una subconsulta porque la primera vez que las usas no tienen tipo y solo valen NULL (fijate en las FAQ de MySQL, allí puse un caso tipo), ya que es el momento en que empiezan a existir.
El segundo problema es ubicar su funcionamiento. Cuando pones una variable en un SELECT, el valor de la variable cambia en el mismo orden de aparición secuencial de uso.
Para darte un ejemplo, suponiendo que @a ya exista, y que valga cero, esta sentencia:
Código sql:
Ver original
  1. SELECT IF(@a =0, 'PRIMERA', 'SEGUNDA') Posicion, @a:=1 orden
  2. FROM tabla;
hará que la primera línea devuelta diga "PRIMERA", pero las siguientes devolverán "SEGUNDA". ¿Cómo puede ser? Simplemente porque al procesar el primer IF de la primera línea, la variable vale cero; pero cuando procesa el segundo miembro del SELECT, la variable pasa a valer 1, con lo que al procesar la segunda línea ya no vale cero.
Si quieres ver un resultado curioso, cruza esta sentencia con cualquier tabla que tengas, cambiando el nombre de "tabla", con el de cualquiera que desees (esto te representará mejor el cambio de valores dinámico de una variable):
Código SQL:
Ver original
  1. SELECT Posicion FROM
  2. (SELECT
  3.   IF(@a =0, 'PRIMERA', 'SEGUNDA') Posicion,
  4.   IF(@a = 1,@a:= 0,  @a:=1) orden
  5. FROM TABLA JOIN (SELECT @a:=0 ) t1)T1
  6. ;
El problema de manipular valores en variables de usuario dinámicas, consiste en controlar la secuencia de reasignaciones de modo que el resultado sea correcto. Cada miembro y cada línea procesados afectan a la variable si la misma tiene resignaciones en alguno de ellos.
¿Se comprende?

Un tipo final para tener en cuenta:
La variable de usuario usada en una consulta sigue existiendo mientras la conexión en la que se creó siga abierta. Dependen de ellas.
También tienes que tener en cuenta que una vez que la creaste y usaste, si la conexión no se cierra, la variable conserva el último valor que se cargó en ella. Si piensas volver a usarla inmediatamente, debes reinicializarla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)