Maison > base de données > tutoriel mysql > Comment diviser les colonnes séparées par des virgules en lignes à l'aide de DB2 SQL ?

Comment diviser les colonnes séparées par des virgules en lignes à l'aide de DB2 SQL ?

Patricia Arquette
Libérer: 2024-12-20 08:40:09
original
360 Les gens l'ont consulté

How to Break Down Comma-Separated Columns into Rows Using DB2 SQL?

Décomposer les colonnes séparées par des virgules en lignes avec DB2

Dans le domaine de la gestion de bases de données, la gestion des valeurs séparées par des virgules peut souvent poser un problème un défi, en particulier lorsqu'il s'agit d'extraire des valeurs individuelles dans des lignes distinctes. Un tel scénario se produit lorsqu'un tableau contient une colonne avec des références séparées par des virgules et qu'il est nécessaire de diviser ces références en lignes individuelles.

Énoncé du problème

Envisagez un tableau avec la structure suivante :

Id | FK_ID | Reference
-----------------------
1 | 2100 | GI2, GI32
2 | 2344 | GI56
Copier après la connexion

Le but est de transformer ces données en ce qui suit souhaité sortie :

Id | FK_ID | Reference
-----------------------
1 | 2100 | GI2
2 | 2100 | GI32
3 | 2344 | GI56
Copier après la connexion

Solution DB2

Pour réaliser cette transformation de données, DB2 fournit une instruction SQL récursive qui divise de manière itérative les valeurs séparées par des virgules en lignes individuelles. La solution exploite le code SQL suivant :

WITH unpivot (lvl, id, fk_ref, reference, tail) AS (  
  SELECT 1, id, fk_ref,     
         CASE WHEN LOCATE(',',reference) > 0 
              THEN TRIM(LEFT(reference, LOCATE(',',reference)-1))
              ELSE TRIM(reference) 
         END,    
         CASE WHEN LOCATE(',',reference) > 0 
              THEN SUBSTR(reference, LOCATE(',',reference)+1)    
              ELSE '' 
         END  
  FROM yourtable  
  UNION ALL  
  SELECT lvl + 1, id, fk_ref,     
         CASE WHEN LOCATE(',', tail) > 0 
              THEN TRIM(LEFT(tail, LOCATE(',', tail)-1))    
              ELSE TRIM(tail) 
         END,    
         CASE WHEN LOCATE(',', tail) > 0 
              THEN SUBSTR(tail, LOCATE(',', tail)+1)    
              ELSE '' 
         END
  FROM unpivot 
  WHERE lvl < 100 AND tail != '')
  SELECT id, fk_ref, reference FROM unpivot
Copier après la connexion

Explication

Ce CTE (Common Table Expression) récursif nommé unpivot utilise la clause UNION ALL pour diviser de manière itérative la référence colonne en valeurs individuelles :

  • lvl représente le niveau de récursion, qui garantit que le processus de fractionnement se termine après un maximum de 100 niveaux.
  • La première ligne du CTE sélectionne le premier jeton de la colonne Référence comme valeur initiale pour référence, et le reste de la chaîne comme queue.
  • Les lignes suivantes utilisent la queue de la ligne précédente comme référence et répètent le processus de fractionnement jusqu'à ce que la queue soit vide ou que le niveau de récursion maximum soit atteint.
  • Enfin, la L'instruction SELECT en dehors du CTE extrait les colonnes id, fk_ref et référence souhaitées du CTE non pivoté.

Remarque :

Il est important d'éviter de stocker des données dans un format séparé par des virgules, car cela peut entraîner des problèmes d’intégrité des données et rendre la manipulation et l’interrogation des données plus complexes. Cependant, la solution fournie offre un moyen de transformer ces données dans un format plus gérable et utilisable dans les cas où cela est inévitable ou nécessaire.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal