Maison >base de données >tutoriel mysql >Comment diviser des valeurs séparées par des virgules en plusieurs lignes dans SQL ?

Comment diviser des valeurs séparées par des virgules en plusieurs lignes dans SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 04:08:09983parcourir

How to Split Comma-Separated Values into Multiple Rows in SQL?

Diviser les valeurs en plusieurs lignes dans SQL

Une tâche courante dans le traitement des données consiste à diviser une chaîne séparée par des virgules en plusieurs lignes, comme illustré par ce qui suit request :

Problème :

Étant donné une table avec une colonne id et une colonne name contenant des valeurs séparées par des virgules, renvoyez les données au format suivant :

id name
1 a
1 b
1 c
2 b

Solution :

Pour y parvenir, nous pouvons tirer parti La fonction SUBSTRING_INDEX de MySQL en conjonction avec une table de nombres qui contient une séquence de nombres jusqu'au nombre maximum de champs à diviser. La requête ci-dessous illustre cette approche :

SELECT
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) AS name
FROM
  numbers INNER JOIN tablename
  ON CHAR_LENGTH(tablename.name) - CHAR_LENGTH(REPLACE(tablename.name, ',', '')) >= numbers.n - 1
ORDER BY
  id, n

Si la création d'une table de nombres n'est pas réalisable, nous pouvons utiliser la requête suivante pour générer la séquence de nombres dans la requête elle-même :

SELECT
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) AS name
FROM
  (
    SELECT 1 AS n UNION ALL
    SELECT 2 UNION ALL SELECT 3 UNION ALL
    SELECT 4 UNION ALL SELECT 5
  ) AS numbers INNER JOIN tablename
  ON CHAR_LENGTH(tablename.name) - CHAR_LENGTH(REPLACE(tablename.name, ',', '')) >= numbers.n - 1
ORDER BY
  id, n

Démo :

[SQL Fiddle Démo](https://www.sqlfiddle.com/#!5/cf4386/1)

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