Mysql
 sql >> Database >  >> RDS >> Mysql

mySQL>> Normalizzazione di un campo delimitato da virgole

Copia il codice nella pubblicazione vera e propria e fornisci il codice che hai provato a utilizzare per risolvere il problema.

La funzione substring_index restituisce una parte di una stringa con qualche delimitatore (qui una virgola), e quando viene passato un indice negativo inizia a cercare le corrispondenze dal lato opposto, quindi -1 prende un elemento da quelli che altrimenti sarebbero elenchi di più elementi (per index>=2).

Secondo la nostra discussione, ho ottimizzato il modo in cui l'ho fatto e ho mostrato un esempio di utilizzo dell'incremento automatico. (Questo viene eseguito nella parte 'build schema' di 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;

documentazione della funzione di sottostringa Possibile duplicazione di questa domanda