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

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

Patricia Arquette
Patricia Arquetteoriginal
2025-01-24 04:22:11134parcourir

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

Transformation de valeurs SQL séparées par des virgules en plusieurs lignes

Une tâche SQL fréquente consiste à diviser le contenu d'une seule cellule en plusieurs lignes. Par exemple, considérons ce tableau :

<code class="language-sql">id | name
1  | a,b,c
2  | b</code>

Le but est de restructurer ces données comme ceci :

<code class="language-sql">id | name
1  | a
1  | b
1  | c
2  | b</code>

Méthode 1 : Exploiter une table de nombres

Une solution efficace utilise un tableau de « nombres » préexistant (un tableau contenant une liste séquentielle d'entiers). La requête ci-dessous illustre cette approche :

<code class="language-sql">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</code>

Méthode 2 : génération dynamique de nombres (aucune table de nombres requise)

Si une table de numéros dédiée n'est pas disponible, une séquence de numéros temporaire peut être générée dans la requête elle-même :

<code class="language-sql">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</code>

N'oubliez pas d'ajuster la section UNION ALL dans la deuxième méthode pour accueillir le nombre maximum de valeurs séparées par des virgules que vous prévoyez dans votre colonne name. Les deux méthodes obtiennent le même résultat : diviser les valeurs séparées par des virgules en lignes individuelles.

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