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

mySQL>> Normaliser un champ délimité par des virgules

Veuillez copier votre code dans la publication réelle et fournir le code que vous avez essayé d'utiliser pour résoudre le problème.

La fonction substring_index renvoie une partie d'une chaîne avec un délimiteur (ici une virgule), et lorsqu'un index négatif est passé, elle commence à rechercher des correspondances du côté opposé, donc -1 récupère un élément de ce qui serait autrement des listes multi-éléments (pour index>=2).

Selon notre discussion, j'ai modifié la façon dont j'ai procédé et montré un exemple d'utilisation de l'auto-incrémentation. (Ceci est exécuté dans la partie 'build schema' de fiddle.)

create table TAGS
(`T_ID` int auto_increment primary key, `T_Name` varchar(18))
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(RES_Tags, ',', 1) as X
    FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 2)
      ,',',-1)
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 3)
      ,',',-1)  as X
  FROM RESOURCES
;
insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 4)
      ,',',-1)  as X
  FROM RESOURCES
  ;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 5)
      ,',',-1)  as X
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 6)
      ,',',-1)  as X
  FROM RESOURCES
;

create table New_TAGS like TAGS;
insert into New_TAGS (T_Name)
  select distinct trim(T_Name)
  from TAGS;

drop table TAGS;
rename table NEW_TAGS to TAGS;

documentation de la fonction substring Duplication possible de cette question