Saltar al contenido

MySQL dividió la cadena separada por comas en una tabla temporal

Solución:

Esta es prácticamente la misma pregunta que ¿Puede Mysql dividir una columna?

MySQL no tiene una función de cadena dividida, por lo que debe realizar soluciones alternativas. Puede hacer cualquier cosa con los datos una vez que los haya dividido utilizando uno de los métodos enumerados en la página de respuestas anterior.

Puede recorrer esa función personalizada y romper cuando regrese vacía, tendrá que jugar y aprender algo de sintaxis (o al menos lo haría yo) 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 función a continuació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-function/)

Que debería devolver ” si no se encuentra ninguna coincidencia, así que rompa el ciclo si no se encuentra ninguna coincidencia. Esto le permitirá con solo mysql analizar la cadena dividida y ejecutar 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: masajee un resultado de Group_Concat () en la cadena csv en una cadena Insert … Values ​​…:

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 unir alguna tabla a la lista de id, puede usar el operador LIKE. Existe mi solución en la que obtengo una lista de identificaciones de las URL de las publicaciones del blog, las convierto a listas separadas por comas que comienzan y terminan con comas y luego me uno a los productos relacionados por la lista de identificaciones 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 $$
¡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 *