Maison >base de données >tutoriel mysql >Comment diviser des chaînes concaténées dans MySQL en lignes individuelles ?

Comment diviser des chaînes concaténées dans MySQL en lignes individuelles ?

DDD
DDDoriginal
2024-12-14 03:15:09875parcourir

How to Split Concatenated Strings in MySQL into Individual Rows?

Diviser les chaînes concaténées dans MySQL

Lorsque vous travaillez avec des tables de base de données, vous pouvez rencontrer des scénarios dans lesquels une seule colonne contient plusieurs valeurs concaténées en une seule chaîne. Alors que la fonction GROUP_CONCAT excelle dans la combinaison de plusieurs lignes en une seule chaîne, son opération inverse, qui consiste à diviser une chaîne concaténée en lignes individuelles, peut constituer un défi. Cette opération est communément appelée expansion ou décomposition de chaîne.

Énoncé du problème :

Un tableau vous est présenté qui stocke une colonne nommée « couleurs » contenant des virgules. listes de couleurs séparées. Votre objectif est de restructurer le tableau dans un format où chaque ligne représente une seule couleur.

Exemple de tableau :

id colors
1 Red,Green,Blue
2 Orangered,Periwinkle

Tableau souhaité Format :

id colors
1 Red
1 Green
1 Blue
2 Orangered
2 Periwinkle

Solution :

Pour obtenir le résultat souhaité, vous pouvez utiliser le MySQL suivant requête :

SELECT
  id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(colors, ',', n.digit+1), ',', -1) AS color
FROM
  colors
  INNER JOIN
  (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) AS n
  ON LENGTH(REPLACE(colors, ',', '')) <= LENGTH(colors)-n.digit
ORDER BY
  id,
  n.digit

Explication :

  1. SUBSTRING_INDEX(SUBSTRING_INDEX(colors, ',', n.digit 1), ',', -1 ) : Cette expression est utilisée pour extraire des couleurs individuelles de la chaîne concaténée. Il utilise d'abord SUBSTRING_INDEX pour extraire la sous-chaîne en commençant par la première virgule après la n.digit-ème virgule et en se terminant à la virgule suivante. Ensuite, il extrait la sous-chaîne en commençant par la deuxième virgule et en se terminant à la fin de la chaîne. Cela sélectionne efficacement une seule couleur.
  2. (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) : Cette sous-requête génère une séquence de nombres de 0 à 3, qui représente la position de chacun. coloriez la chaîne concaténée.
  3. ON LENGTH(REPLACE(colors, ',', '')) <= LENGTH(colors)-n.digit : Cette condition de jointure garantit que la requête ne renvoie que les lignes dont le nombre de couleurs (délimitées par des virgules) est inférieur ou égal à 4.
  4. ORDER BY id, n.digit : Cela garantit que les résultats sont triés à la fois par identifiant et par position de couleur dans les couleurs. column.

Remarque : Cette requête suppose que chaque ligne contient un maximum de 4 couleurs. Si vos lignes peuvent avoir plus de 4 couleurs, vous devrez modifier la sous-requête pour générer une séquence de nombres plus grande.

En implémentant cette requête, vous pouvez diviser efficacement les chaînes concaténées de votre table en lignes individuelles, permettant un traitement et une analyse plus faciles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn