Saltar al contenido

MySQL divide una cadena separada por comas en una tabla temporal

Este enunciado ha sido probado por expertos para que tengas la garantía de la veracidad de este post.

Solución:

Esta es más o menos la misma pregunta que ¿Puede Mysql dividir una columna?

MySQL no tiene una división string función por lo que tiene que hacer trabajo arounds. Puede hacer cualquier cosa con los datos una vez que los divida utilizando uno de los métodos enumerados en la página de respuestas anterior.

Puede recorrer esa función personalizada y romper cuando vuelve vacía, tendrá que jugar y aprender algo de sintaxis (o al menos yo lo haría), pero la sintaxis para un bucle FOR en mysql está aquí: http://www.roseindia .net/sql/mysql-example/for.shtml

Puede iterar sobre él, incrementando la posición en la siguiente función:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

(Crédito: https://blog.fedecarg.com/2009/02/22/mysql-split-string-función/ )

Que debería devolver ” si no se encuentra ninguna coincidencia, así que rompa el ciclo si no se encuentra ninguna coincidencia. Esto le permitirá analizar solo mysql sobre la división string y ejecute las consultas de inserción en una tabla temporal. Pero hombre, ¿por qué no usar un lenguaje de secuencias de comandos como php para ese tipo de trabajo? 🙁

Código para la sintaxis de bucle:

DELIMITER $$  

CREATE PROCEDURE ABC(fullstr)

   BEGIN
      DECLARE a INT Default 0 ;
      DECLARE str VARCHAR(255);
      simple_loop: LOOP
         SET a=a+1;
         SET str=SPLIT_STR(fullstr,"|",a);
         IF str='' THEN
            LEAVE simple_loop;
         END IF;
         #Do Inserts into temp table here with str going into the row
         insert into my_temp_table values (str);
   END LOOP simple_loop;
END $$

Encontré una buena solución para esto.

https://forums.mysql.com/read.php?10,635524,635529

Gracias a Peter Brawley

Truco: masajear un resultado de Group_Concat() en el csv string en un Insertar… Valores… string:

drop table if exists t;
create table t( txt text );
insert into t values('1,2,3,4,5,6,7,8,9');

drop temporary table if exists temp;
create temporary table temp( val char(255) );
set @sql = concat("insert into temp (val) values ('", replace(( select group_concat(distinct txt) as data from t), ",", "'),('"),"');");
prepare stmt1 from @sql;
execute stmt1;
select distinct(val) from temp;
+------+
| val  |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
| 6    |
| 7    |
| 8    |
| 9    |
+------+

Además, si solo desea unirse a alguna tabla para listar la identificación, puede usar el operador LIKE. Existe mi solución en la que obtengo una lista de ID de las URL de las publicaciones del blog, las convierto en una lista separada por comas que comienza y termina con comas y luego me uno a los productos relacionados por lista de ID con el operador LIKE.

SELECT b2.id blog_id, b2.id_list, p.id
FROM (
    SELECT b.id,b.text,
    CONCAT(
        ",",
            REPLACE(
                EXTRACTVALUE(b.text,'//a/@id')
                , " ", ","
            )
        ,","
    ) AS id_list
    FROM blog b
) b2
LEFT JOIN production p ON b2.id_list LIKE CONCAT('%,',p.id,',%')
HAVING b2.id_list != ''

DELIMITER $$  

CREATE PROCEDURE SPLIT_VALUE_STRING()

    BEGIN

        SET @String      = '1,22,333,444,5555,66666,777777';
        SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
        myloop: WHILE (@Occurrences > 0)
        DO 
            SET @myValue = SUBSTRING_INDEX(@String, ',', 1);
            IF (@myValue != '') THEN
            /* my code... */
            ELSE
                LEAVE myloop; 
            END IF;
            SET @Occurrences = LENGTH(@String) - LENGTH(REPLACE(@String, ',', ''));
            IF (@occurrences = 0) THEN 
                LEAVE myloop; 
            END IF;
            SET @String = SUBSTRING(@String,LENGTH(SUBSTRING_INDEX(@String, ',', 1))+2);
        END WHILE;                  

   END $$

Eres capaz de sostener nuestra ocupación poniendo un comentario o dejando una valoración te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *