Maison >base de données >tutoriel mysql >Comment diviser les valeurs séparées par des virgules dans SQL en plusieurs lignes ?
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!