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

Como splitar valor de columnas

Estas en el tema de Como splitar valor de columnas en el foro de Mysql en Foros del Web. Buenas, Me gustaría saber cómo puedo splitar el valor de una columna que contiene valores como los siguientes, todos ellos tienen en comun que estan ...
  #1 (permalink)  
Antiguo 16/05/2010, 13:42
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Como splitar valor de columnas

Buenas,

Me gustaría saber cómo puedo splitar el valor de una columna que contiene valores como los siguientes, todos ellos tienen en comun que estan divididos por un guion medio. Ej.

2-1
3-3
1-2

He estado repasando las funciones con string de mysql pero no he visto ninguna capaz de separar los dos valores y poder compararlos.

http://dev.mysql.com/doc/refman/5.0/...functions.html

El objetivo es poder discriminar cuando el primer valor es igual o mas grande que el segundo.

Ej.
1-0 >> el primer valor es mayor que el segundo
3-3 >> los dos valores son iguales
1-2 >> el primer valor es mas pequeño que el segundo

¿Existe alguna forma de hacerlo con mysql? o es más rápido dejárselo al lenguaje de programación de la página web (PHP)?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 16/05/2010, 14:21
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: Como splitar valor de columnas

Cita:
¿Existe alguna forma de hacerlo con mysql? o es más rápido dejárselo al lenguaje de programación de la página web (PHP)?
En esencia, una función como split, se usa para crear arrays de datos, y el problema es que no existen los array en los SP de MySQL, ni tampoco como función de ningún tipo, como es en el caso de Postgre que sí los tiene. Por ello es mejor dejárselo a la aplicación, sean el lo que sea que programes.
Por otro lado, si se necesita romper una cadena en varios valores individuales, es de suponer que en realidad estás hablando de un campo multivaluado, lo que significa que el modelo de datos ,tiene serios defectos, por cuanto los campos multivaluados no son admisibles en el modelo E-R.
Finalmente, si el problema es que deseas comparar un segmento de una cadena, existe una función que es SUBSTRING_INDEX(str,delim,count):
Cita:
SUBSTRING_INDEX(str,delim,count)
Retorna la subcadena de la cadena str antes de count ocurrencias del delimitador delim. Si count es positivo, todo a la izquierda del delimitador final (contando desde la izquierda) se retorna. Si count es negativo, todo a la derecha del delimitador final (contando desde la derecha) se retorna.

SELECT SUBSTRING_INDEX('www.mysql.com', '.', 1);
-> 'www'
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -1);
-> 'com'

SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'
Esta función trabaja con múltiples bytes.
__________________
¿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 16/05/2010, 14:39
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Como splitar valor de columnas

Gracias gnzsoloyo,

He probado esta de aquí que segun ponga 1 o -1 me devuelve el primer o segundo número respectivamente.

SELECT SUBSTRING_INDEX('1-2', '-', 1);

Y esta otra me devuelve la columna en cuestión

SELECT ht FROM partidos;

¿Existe alguna forma de hacer una consulta?

Para cada fila extrae el primer valor y compáralo con el segundo valor

Además, no se si es muy optimo hacer esa consulta SELECT ht FROM partidos; cuando hay mas de 1 millón de datos, si extraigo todas las filas y las guardo en un array vía programación web para luego recorrerlo puede demorar más tiempo no?

Gracias de antemano!
  #4 (permalink)  
Antiguo 16/05/2010, 14:42
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: Como splitar valor de columnas

Postea una sentencia de ejemplo de lo que intentarías hacer para entender mejor qué comparaciones deben ir y ver cómo se podría resolver.
__________________
¿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 16/05/2010, 16:53
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Como splitar valor de columnas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Postea una sentencia de ejemplo de lo que intentarías hacer para entender mejor qué comparaciones deben ir y ver cómo se podría resolver.
Uhm la sentencia? sería algo asi

Código:
col1 = "3-2"

split col1 => val1 = "3" y val2="2"

Para cada fila de (SELECT ht FROM partidos) {
splita col1 a continuación la comparación pertinente de 3 posibles si val1 > val2 si val1 < val2 si val1 = val2
}
No se si de esta forma se ve clara mis intenciones

Muchas gracias de antemano!
  #6 (permalink)  
Antiguo 16/05/2010, 17: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: Como splitar valor de columnas

Bien, supongamos que el campo `ht` tenga este tipo de valores "2-1". Si quisieras simplemente que el resultado de la operación saliese en la tabla, en principio sería
Código MySQL:
Ver original
  1.     SUBSTRING_INDEX(`ht`, '-', -1) operando1,
  2.     SUBSTRING_INDEX(`ht`, '-', 1) operando2,  
  3.     (SUBSTRING_INDEX(`ht`, '-', -1)  - SUBSTRING_INDEX(`ht`, '-', 1))  resultado
  4. FROM partidos;
Parece bien, pero el problema es que SUBSTRING_INDEX() devuelve una cadena, y la operación de substracción no está definida para ese caso. Para hacerlo se debe transformar el valor en un número:
Código MySQL:
Ver original
  1.     SUBSTRING_INDEX(`ht`, '-', -1) operando1,
  2.     SUBSTRING_INDEX(`ht`, '-', 1) operando2,  
  3.     (CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED)  - CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED))  resultado
  4. FROM partidos;
Ahora bien, si lo que quieres es que según quien sea el de mayor valor, devuelva un nombre determinado, el tema es simplemente que hay que usar esa misma función dentro de una función IF():
Código MySQL:
Ver original
  1.     IF(CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED)  >CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED), equipo1, equipo2)  ganador,
  2. FROM partidos;
Si, por otro lado, quisieras simplemente saber cuál es el esquema de tantos y cuál el resultado (suponiendo que esto es una tabla de resultados futbolísticos), la cosa andaría por:
Código MySQL:
Ver original
  1.     equipo1 `Local`,
  2.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  3.     equipo2 `Visitante`,
  4.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles,
  5.     IF(CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED)  > CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED), 'Local', IF(CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED)  < CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED), 'Visitante', 'Empate') )  Ganador,
  6. FROM partidos;
Podrías seguir hasta casi la eternidad, con esto, pero creo que será suficiente por ahora.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/05/2010, 00:06
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Como splitar valor de columnas

Mil gracias gnzsoloyo, efectivamente eso intentaba, lo bordaste!
  #8 (permalink)  
Antiguo 17/05/2010, 11:36
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Como splitar valor de columnas

Holas!

Estoy intentando sacar los partidos cuyo resultado sea la victoria del equipo local, pero no me da un error de sintaxis que no consigo ver.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) > (CAST(SUBSTRING_INDEX(`ht' at line 6


Código SQL:
Ver original
  1. SELECT
  2.     home `Local`,
  3.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  4.     away `Visitante`,
  5.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles
  6.     WHERE CAST(SUBSTRING_INDEX(`ht`, '-', -1)) > (CAST(SUBSTRING_INDEX(`ht`, '-', 1))
  7. FROM partidos;


Código SQL:
Ver original
  1. SELECT
  2.     home `Local`,
  3.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  4.     away `Visitante`,
  5.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles
  6.     WHERE CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) > (CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED)
  7. FROM partidos;


Código SQL:
Ver original
  1. SELECT
  2.     home `Local`,
  3.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  4.     away `Visitante`,
  5.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles,
  6.     IF(CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) > CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED), 'Local')
  7. FROM partidos;

Qué hago mal?

Gracias de antemano!

Última edición por neodani; 17/05/2010 a las 11:41
  #9 (permalink)  
Antiguo 17/05/2010, 12:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Como splitar valor de columnas

Neodani...
La clausula WHERE siempre va después de especificar la(s) tabla(s) involucradas.

Código SQL:
Ver original
  1. SELECT
  2.     home `Local`,
  3.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  4.     away `Visitante`,
  5.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles
  6.     FROM partidos    
  7. WHERE CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) > (CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED)
;

Precisamente es ahí donde salta el error
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 17/05/2010, 13:29
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Como splitar valor de columnas

Cita:
Iniciado por huesos52 Ver Mensaje
Neodani...
La clausula WHERE siempre va después de especificar la(s) tabla(s) involucradas.

Código SQL:
Ver original
  1. SELECT
  2.     home `Local`,
  3.     CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) Goles,
  4.     away `Visitante`,
  5.     CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED) Goles
  6.     FROM partidos    
  7. WHERE CAST(SUBSTRING_INDEX(`ht`, '-', -1) AS SIGNED) > (CAST(SUBSTRING_INDEX(`ht`, '-', 1) AS SIGNED)
;

Precisamente es ahí donde salta el error
Ostras es verdad, estaba cegado en que tenía que ir ahí y no vi que iba después del from

Muchas gracias huesos
  #11 (permalink)  
Antiguo 12/11/2010, 23:34
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Como splitar valor de columnas

Hola, paso por este tema para no abrir otro, ya que tengo que hacer algo similar.

a un store procedure de la base de datos le paso la siguiente cadena

1_3_9_x_y_z_2343 o sea numeros separados con guion bajo (el guion bajo seria el separador que deberia usar en la funcion string_index).

Dentro del SP tendria que dividir este string en numeros e insertarlos uno por uno en una tabla de la base de datos.

Resumo un pseudocodigo...

viene el string completo que seria 1_2_5_8
agarro el 1 y lo inserto (que lo copiaria en una variable auxiliar y luego deberia reescribir el string originical que quedaria 2_5_8)
agarro el 2 y lo inserto, el string queda 5_8
agarro el 5 y lo inserto, el string queda 8
agarro el 8 lo inserto, fin...

desde la aplicacion de php, estamos usando dhtmlx donde tiene una grilla, que donde esta checkeado debo insertar el id de ese registro en la base de datos.

supongo que dentro del SP deberia haber un LOOP que controle la finalizacion del string.

alguna idea?.

muchas gracias.

edit, esto podria hacerse desde la aplicacion, pero en este caso es mucho mas practico hacerlo en la base de datos, ya que necesito atomicidad al insertar todos estos registros, que con una transaccion queda resuelto.
  #12 (permalink)  
Antiguo 13/11/2010, 00:15
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Como splitar valor de columnas

por lo que vi del manual de mysql para poder resolver esto necesitaria estas funciones

LENGTH
SUBSTRING_INDEX
LOCATE
LEFT Y/O RIGHT
mas variables auxiliares mas un loop...
  #13 (permalink)  
Antiguo 13/11/2010, 05:46
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: Como splitar valor de columnas

Dos detalles:

1) Vamos al problema.
Cita:
edit, esto podria hacerse desde la aplicacion, pero en este caso es mucho mas practico hacerlo en la base de datos, ya que necesito atomicidad al insertar todos estos registros, que con una transaccion queda resuelto.
No necesitas un SP para resolver eso. Solamente necesitas un INSERT múltiple, que a su vez esté dentro de una transacción, y las transacciones pueden declararse por fuera de un SP perfectamente. En tu caso solamente necesitas tres sentencias:
Código MySQL:
Ver original
  1.  
  2. INSERT INTI tabla(campo) VALUES('1'), ('3'), ('9'), ('x'), ('y'), ('z'), ('2343');
  3.  
Estoy poniendo los números entre apóstrofes porque infiero que el campo a llenar es un VARCHAR, o de lo contrario no mandarías letras. Si no lo es, si es un numérico, los apóstrofes no van.
Si estás trabajando con PHP, cada una de estas sentencias es un mysql_query(), de los cuales en el segundo verificas si hubo un error o bien si la cantidad de registros insertados se corresponde con la cantidad de ítems, y en caso contrario en lugar de enviar COMMIT, envías ROLLBACK.

¿Se entiende la idea?

El único secreto que tiene esto es que los VALUES deben ser incorporados en un ciclo FOR/NEXT si se deben crear dinámicamente.

2) No postees una pregunta propia en un post ajeno cuando se trata de una pregunta nueva sin ser parte de la conversación que se ha ido produciendo. No es buena costumbre no sólo porque no es cortés, sino porque los moderadores suelen cerrar post viejos cuando alguien los resucita, y porque además uno no abre el post para ver tu pregunta, sino la pregunta del que inició el tema. Es como meterse en conversación ajena si pedir permiso.
Es mucho mejor, aunque el tema sea parecido, que abras un post nuevo. Siempre.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 14/11/2010, 00:59
 
Fecha de Ingreso: junio-2010
Mensajes: 11
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Como splitar valor de columnas

respeto tu opinion sobre que necesito o no necesito para resolver el problema
el tema es que el sistema lo estamos desarrollando con este metodo, todos sp en la base de datos.
el formulario es para dar de alta (o de baja) roles de usuario en la tabla rol_usuario que es la que vincula a los usuarios con los roles que le dan funcionalidad en el sistema.
esta tabla tiene 2 campos mas que son el id del usuario y la fecha de creacion de los roles (que es un datetime que se carga con la fucion now()).

el sp recibe 2 parametros, el id de usuario y el string con los roles, tiene un parametro de salida que es un mensaje (varchar) donde se indica si el procedimiento se ejecuto ok o si hubo algun inconveniente (implementado con handlers)

de hacerlo como vos me decis (con un solo insert), pero con el sp, como podria resolverlo sin romperme la cabeza para desmenuzar el string.
desde javascript puedo usar como separador de los ids la coma en vez del guion bajo, por lo que recibiria el string asi 1,2,3,4,5,etc

en relacion al tema de abrir o no otro post, como me parecio que era bastante reciente (con respecto a otros post mas antiguos) y tenia relacion, aunque si se resuelve de esta otra forma no la tendria, no me parecia correcto abrir otro thread. errores que uno comete.
saludos.
  #15 (permalink)  
Antiguo 25/08/2011, 20:59
 
Fecha de Ingreso: abril-2009
Ubicación: Bogota
Mensajes: 18
Antigüedad: 15 años
Puntos: 0
Respuesta: Como splitar valor de columnas

Cordial saludo gnzsoloyo.
Mi problema es el siguiente: Tengo un campo que almacena Nombre1 Nombre2, Apellido1, Apellido2 (asumo no hay nombres compuestos) la tarea es dejarlo en 3 campos asi:
Nombres, Apellido1, Apellido2.
Agradeciendo la atencion prestada.

Etiquetas: columnas
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 22:12.