Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL divise la chaîne séparée par des virgules dans la table temporaire

C'est à peu près la même question que Mysql peut-il diviser une colonne ?

MySQL n'a pas de fonction de chaîne fractionnée, vous devez donc contourner le problème. Vous pouvez faire n'importe quoi avec les données une fois que vous les avez divisées en utilisant l'une des méthodes répertoriées sur la page de réponse ci-dessus.

Vous pouvez boucler sur cette fonction personnalisée et la casser lorsqu'elle revient vide, vous devrez jouer et apprendre une syntaxe (ou du moins je le ferais) mais la syntaxe d'une boucle FOR dans mysql est ici :http://www.roseindia.net/sql/mysql-example/for.shtml

Vous pouvez itérer dessus, en incrémentant la position dans la fonction ci-dessous :

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édit :https://blog.fedecarg.com /2009/02/22/mysql-split-string-function/ )

Qui devrait retourner '' si aucune correspondance n'est trouvée, donc rompre la boucle si aucune correspondance n'est trouvée. Cela vous permettra d'analyser uniquement mysql sur la chaîne fractionnée et d'exécuter les requêtes d'insertion dans une table temporaire. Mais mec, pourquoi ne pas simplement utiliser un langage de script comme php pour ce genre de travail ? :(

Code pour la syntaxe de la boucle :

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 $$