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

Dividir el contenido de un campo en dos campos

Estas en el tema de Dividir el contenido de un campo en dos campos en el foro de Mysql en Foros del Web. Buenas tardes Foreros!!!! Les escribo ya que tengo una consulta... Actualmente tengo una BD con 5000 registros, y utilizaba un campo para guardar las coordenadas ...
  #1 (permalink)  
Antiguo 07/08/2012, 11:41
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 7 meses
Puntos: 0
Pregunta Dividir el contenido de un campo en dos campos

Buenas tardes Foreros!!!! Les escribo ya que tengo una consulta...
Actualmente tengo una BD con 5000 registros, y utilizaba un campo para guardar las coordenadas de Google, es decir: "coordenadas" -> "-50.23232323,-100.74329430" , en un campo varchar de 100, lo que necesito realizar por cuestiones de eficiencia es dividir este campo en dos, es decir latitud y longitud... pero necesito realizar un script que me tome los valores que actualmente hay en el campo "coordenadas", y lo divida en los campos "latitud" y "longitud" - utilizando la "," (coma) como parametro para esto...
Estuve leyendo por ahi que se podria utilizar el SUBSTRING(campo,1,LOCATE(" ",campo)) pero no entiendo como decirle a mysql que el contenido lo guarde en los dos nuevos campos...

Muchas gracias desde ya por su colaboracion!!!!
  #2 (permalink)  
Antiguo 07/08/2012, 12:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Dividir el contenido de un campo en dos campos

Hola gandalf_2706:

Si los campos están en la misma tabla, simplemente haces un UPDATE, para extraer cada uno de los campos.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----+----------------------------+---------+----------+
  3. | id | coordenadas                | latitud | longitud |
  4. +----+----------------------------+---------+----------+
  5. |  1 | -50.23232323,-100.74329430 | NULL    | NULL     |
  6. |  2 | 51.506944,-0.1275          | NULL    | NULL     |
  7. |  3 | 19.433333,-99.133333       | NULL    | NULL     |
  8. +----+----------------------------+---------+----------+
  9. 3 rows in set (0.07 sec)
  10.  
  11. mysql> UPDATE tabla SET
  12.     -> latitud = SUBSTRING(coordenadas,1,LOCATE(",",coordenadas) - 1),
  13.     -> longitud = SUBSTRING(coordenadas,LOCATE(",",coordenadas) + 1,
  14.     -> LENGTH(coordenadas));
  15. Query OK, 3 rows affected (0.03 sec)
  16. Rows matched: 3  Changed: 3  Warnings: 0
  17.  
  18. mysql> SELECT * FROM tabla;
  19. +----+----------------------------+--------------+---------------+
  20. | id | coordenadas                | latitud      | longitud      |
  21. +----+----------------------------+--------------+---------------+
  22. |  1 | -50.23232323,-100.74329430 | -50.23232323 | -100.74329430 |
  23. |  2 | 51.506944,-0.1275          | 51.506944    | -0.1275       |
  24. |  3 | 19.433333,-99.133333       | 19.433333    | -99.133333    |
  25. +----+----------------------------+--------------+---------------+
  26. 3 rows in set (0.00 sec)

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo
  #3 (permalink)  
Antiguo 07/08/2012, 13:07
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Dividir el contenido de un campo en dos campos

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola gandalf_2706:

Si los campos están en la misma tabla, simplemente haces un UPDATE, para extraer cada uno de los campos.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----+----------------------------+---------+----------+
  3. | id | coordenadas                | latitud | longitud |
  4. +----+----------------------------+---------+----------+
  5. |  1 | -50.23232323,-100.74329430 | NULL    | NULL     |
  6. |  2 | 51.506944,-0.1275          | NULL    | NULL     |
  7. |  3 | 19.433333,-99.133333       | NULL    | NULL     |
  8. +----+----------------------------+---------+----------+
  9. 3 rows in set (0.07 sec)
  10.  
  11. mysql> UPDATE tabla SET
  12.     -> latitud = SUBSTRING(coordenadas,1,LOCATE(",",coordenadas) - 1),
  13.     -> longitud = SUBSTRING(coordenadas,LOCATE(",",coordenadas) + 1,
  14.     -> LENGTH(coordenadas));
  15. Query OK, 3 rows affected (0.03 sec)
  16. Rows matched: 3  Changed: 3  Warnings: 0
  17.  
  18. mysql> SELECT * FROM tabla;
  19. +----+----------------------------+--------------+---------------+
  20. | id | coordenadas                | latitud      | longitud      |
  21. +----+----------------------------+--------------+---------------+
  22. |  1 | -50.23232323,-100.74329430 | -50.23232323 | -100.74329430 |
  23. |  2 | 51.506944,-0.1275          | 51.506944    | -0.1275       |
  24. |  3 | 19.433333,-99.133333       | 19.433333    | -99.133333    |
  25. +----+----------------------------+--------------+---------------+
  26. 3 rows in set (0.00 sec)

Dale un vistazo para ver si es lo que necesitas.

Saludos
Leo
Increible Leonardo, era totalmente lo que necesitaba!!!

Muchas gracias!
  #4 (permalink)  
Antiguo 18/09/2012, 10:49
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Dividir el contenido de un campo en dos campos

Buenas de nuevo, si bien eso soluciono mi problema, el tema es que ahora el campo tiene 3 datos, latitud, longitud y algunas veces zoom, por lo tanto, quiero que se separe en 3 campos, entendi como funcionaba la funcion locate, pero si quiero localizar la segunda coma (en caso de que exista) para colocar el valor en el tercer campo, como seria?

Originalmente era asi:

UPDATE tabla SET
latitud = SUBSTRING(coordenadas,1,LOCATE(",",coordenadas) - 1),
longitud = SUBSTRING(coordenadas,LOCATE(",",coordenadas) + 1,
LENGTH(coordenadas));

Yo implemente lo siguiente:

UPDATE tabla SET
latitud = SUBSTRING(coordenadas,1,LOCATE(",",coordenadas) - 1),
longitud = SUBSTRING(coordenadas,LOCATE(",",coordenadas) + 1,
zoom_mapa = SUBSTRING(geopos,LOCATE(",",geopos,LENGTH(lat)+LEN GTH(lon)) + 1, LENGTH(geopos));

Esto funciona bien con campos que tienen las 2 comas, por ejemplo:

coordenadas = 9.305236786124137,-79.95585698437503,7
Luego
latitud = 9.305236786124137
longitud = -79.95585698437503,7
zoom_mapa = 7

Pero, como algunos valores no tienen la segunda coma, recorre nuevamente la cadena y el tercer campo toma el primer valor, es decir:

coordenadas = 89.74658693637143,-64.08262457682292
Luego:
latitud = 89.74658693637143
longitud = -64.08262457682292
zoom_mapa = 89.74658693637143

Espero que alguien pueda ayudarme!!!
Desde ya muchas gracias!!!!

Última edición por gandalf_2706; 18/09/2012 a las 10:58 Razón: Solucion parcial
  #5 (permalink)  
Antiguo 18/09/2012, 12:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Dividir el contenido de un campo en dos campos

Hola de nuevo gandalf_2706:

Te voy a pedir de favor, que en el futuro, NO REVIVAS TEMAS ANTIGUOS, independientemente que sean preguntas que tu hayas lanzado... este tema lo comenzaste hace más de un mes y en realidad ya estaba resuelto, así es que aunque se trate de un tema relacionado, lo correcto es que abras un nuevo tema y pongas la referencia hacia el tema relacionado. Ojo para la próxima.

MySQL proporciona un set bastante rico de funciones para el manejo de cadenas, para resolver tu problema era cuestión de que investigaras un poco en estas funciones para poder dar con alguna que te sirviera. En realidad tienes muchas maneras para validar lo que quieres, se me ocurre por ejemplo que utilices la función SUBSTRING_INDEX para ir "recortando" la cadena de busqueda... checa este script

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------------------+
  3. | id   | coordenadas       |
  4. +------+-------------------+
  5. |    1 | 9.3052,-79.9558,7 |
  6. |    2 | 89.7465,-64.0826  |
  7. |    3 | -50.2323          |
  8. +------+-------------------+
  9. 3 rows in set (0.02 sec)

Observa que en el primero de los casos tengo 2 comas, en el segundo sólo una y en el tercero no tengo ninguna... para separar cada cadena utilizo la función SUBSTRING_INDEX:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> coordenadas,
  3.     -> SUBSTRING_INDEX(coordenadas, ',', 1) latitud,
  4.     -> SUBSTRING_INDEX(SUBSTRING(coordenadas,
  5.     -> LENGTH(SUBSTRING_INDEX(coordenadas, ',', 1)) + 2), ',', 1) longitud,
  6.     -> SUBSTRING_INDEX(SUBSTRING(coordenadas,
  7.     -> LENGTH(SUBSTRING_INDEX(coordenadas, ',', 2)) + 2), ',', 1) zoom_mapa
  8.     -> FROM tabla;
  9. +-------------------+----------+----------+-----------+
  10. | coordenadas       | latitud  | longitud | zoom_mapa |
  11. +-------------------+----------+----------+-----------+
  12. | 9.3052,-79.9558,7 | 9.3052   | -79.9558 | 7         |
  13. | 89.7465,-64.0826  | 89.7465  | -64.0826 |           |
  14. | -50.2323          | -50.2323 |          |           |
  15. +-------------------+----------+----------+-----------+
  16. 3 rows in set (0.00 sec)

la idea como te dije es "recortar" la cadena al hacer esto

Código:
SUBSTRING_INDEX(coordenadas, ',', 1)
SUBSTRING_INDEX(coordenadas, ',', 2)
le estás indicando qué parte de la cadena original tienes que eliminar:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> coordenadas,
  3.     -> SUBSTRING_INDEX(coordenadas, ',', 1) uno,
  4.     -> SUBSTRING_INDEX(coordenadas, ',', 2) dos
  5.     -> FROM tabla;
  6. +-------------------+----------+------------------+
  7. | coordenadas       | uno      | dos              |
  8. +-------------------+----------+------------------+
  9. | 9.3052,-79.9558,7 | 9.3052   | 9.3052,-79.9558  |
  10. | 89.7465,-64.0826  | 89.7465  | 89.7465,-64.0826 |
  11. | -50.2323          | -50.2323 | -50.2323         |
  12. +-------------------+----------+------------------+
  13. 3 rows in set (0.00 sec)

Esta sería una forma genérica de separar cualquier número de items.

Hay otras formas para hacer esto mismo, es posible que mejores que esta, es cuestión que continúes investigando.

Saludos
Leo.
  #6 (permalink)  
Antiguo 18/09/2012, 12:18
 
Fecha de Ingreso: marzo-2010
Mensajes: 34
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Dividir el contenido de un campo en dos campos

Muchas gracias Leo, y pido disculpas por revivir este hilo, pense que era lo mas conveniente, pero ya se para la proxima... ;)

Te hago una ultima consulta, utilizando esta funcion que me sugeris, logro lo siguiente:

UPDATE evento SET
lat = SUBSTRING_INDEX(geopos, ',', 1),
lon = SUBSTRING_INDEX(SUBSTRING(geopos, LENGTH(SUBSTRING_INDEX(geopos, ',', 1)) + 2), ',', 1) ,
zoom_mapa = SUBSTRING_INDEX(SUBSTRING(geopos, LENGTH(SUBSTRING_INDEX(geopos, ',', 2)) + 2), ',', 1);

Existe la posibilidad de evaluar la ultima SUBSTRING_INDEX y que si es 0, (es decir que no exista una segunda coma) en vez de que me grabe en la BD 0 me grabe un valor por defecto o que directamente no grabe nada, porque en la BD tengo como predeterminado un valor distinto a 0, ya que no debo tener valores 0 en este campo...

Desde ya muchas gracias Leo!
  #7 (permalink)  
Antiguo 18/09/2012, 13:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Dividir el contenido de un campo en dos campos

Hola de nuevo gandalf_2706:

Puedes utilizar un IF o un CASE WHEN para evaluar primeramente el resultado del último SUBSTRING, algo así:

Código:
IF (SUBSTRING...... != '', SUBSTRING ..........., 'lo que quieras')
Como observación, el resultado del SUBSTRING seria una cadena vacía (''), no un cero.

Saludos
Leo.

Etiquetas: cortar, dividir
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 13:35.