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

usando CONCAT

Estas en el tema de usando CONCAT en el foro de Mysql en Foros del Web. Hola a todos estoy usando algo asi SELECT CONCAT(nombre, ', ', apellido) nombre_completo este resultado es optimo nombre = juan apellido = perez nombre_completo = ...
  #1 (permalink)  
Antiguo 28/06/2009, 15:03
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
usando CONCAT

Hola a todos
estoy usando algo asi

SELECT CONCAT(nombre, ', ', apellido) nombre_completo

este resultado es optimo
nombre = juan
apellido = perez
nombre_completo = juan, perez

pero este....

nombre =
apellido =
nombre_completo = ,

la idea seria que si nombre y apellido estan vacios que me devuelva nada
no que me devuelva la "," que puse en el concat

probe con IFNULL pero no sirve porque siempre en la sentencia esta "," (esten o no vacios nombre y apellido)
__________________
On error no hago nada porque deje de fumar...
  #2 (permalink)  
Antiguo 28/06/2009, 17:31
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: usando CONCAT

La sentencia se vuelve un poquito larga en ese caso:
Código SQL:
Ver original
  1. SELECT IF((nombre != '' AND apellido != '', CONCAT(nombre, ', ', apellido), '')) `Nombre y apellido`;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/06/2009, 19:21
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: usando CONCAT

genial... y es efectiva esa manera ?? me refiero a rendimiento
__________________
On error no hago nada porque deje de fumar...
  #4 (permalink)  
Antiguo 28/06/2009, 20:03
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: usando CONCAT

No afecta la performance, si a eso te refieres, porque lo único que hace es un encadenamiento condicional.
Para notarse alguna diferencia deberías procesar millones de registros.
__________________
¿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 28/06/2009, 20:17
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: usando CONCAT

bueno.. voy por 200.000 cuando me acerque al millon te aviso
gracias!!!!
__________________
On error no hago nada porque deje de fumar...
  #6 (permalink)  
Antiguo 28/06/2009, 20:26
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: usando CONCAT

se pueden crear variables?? asi no estoy anindando IFS

poruqe me gustaria agregar una condicion y que quede asi

si nombre = '' y apellido = '' entonces [ni nombre y apellido]
si nombre = '' y apellido !='' entonces [solo tiene apellido]
si nombre !='' y apellido ='' entonces [solo tiene nombre]
si nombre !='' y apellido !='' entonces [tiene nombre y apellido]

segun me dijiste quedaria algo asi... pero es muy largoo

IF(apellido !='' OR nombre !='',IF(nombre!='' AND apellido ='',nombre,IF(nombre='' AND apellido !='',apellido)),'ni nombre ni apellido') nombre_completo
__________________
On error no hago nada porque deje de fumar...
  #7 (permalink)  
Antiguo 28/06/2009, 20:44
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: 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)
  #8 (permalink)  
Antiguo 28/06/2009, 21:11
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: usando CONCAT

genial tu explicacion...!! muy util
pero que pasa si la variable la creamos fuera del SELECT.. osea la inicializamos antes?
__________________
On error no hago nada porque deje de fumar...
  #9 (permalink)  
Antiguo 28/06/2009, 21:19
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: usando CONCAT

Acuerdate de lo que dije:
- La variable de usuario pertenece a la conexión y al usuario.
- Mientras la conexión siga activa, sigue existiendo después de haberla usado al menos una vez.
- En todos los casos, conserva el último valor que se le asignó.
- Cualquier asignación en un miembro de un SELECT o en una función, o sentencia DML que la invoque, cambia su valor. Siempre.
- Si se ejecuta una sentencia para crear la variable, la variable comienza a existir y es invocable mientras la conexión siga activa, con el valor que se le dio.

EL resto depende de ti.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 17:13.