Maison >base de données >tutoriel mysql >Comment annuler le pivotement des données séparées par des virgules dans DB2 à l'aide de SQL récursif ?

Comment annuler le pivotement des données séparées par des virgules dans DB2 à l'aide de SQL récursif ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-31 12:51:11235parcourir

How to Unpivot Comma-Separated Data in DB2 Using Recursive SQL?

Données non pivotantes séparées par des virgules dans DB2

Dans la conception de bases de données, il est imprudent de stocker plusieurs références dans une seule colonne séparées par des virgules. Cette pratique peut conduire à des inefficacités et à des incohérences des données. Cependant, des situations peuvent survenir dans lesquelles vous héritez d'une base de données avec une telle structure de données, ce qui nécessite de la transformer en une forme normalisée.

Pour annuler le pivotement des données séparées par des virgules dans DB2, vous pouvez exploiter le SQL récursif. La requête suivante fournit une solution :

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

Cette requête annule le pivotement du contenu séparé par des virgules en lignes individuelles. Il utilise la récursivité pour parcourir la queue (références non traitées restantes) et générer de nouvelles lignes tant qu'il y a des virgules et que le niveau (profondeur de récursion) est inférieur à 100.

Remarque : Cette requête n'a pas été testée et peut nécessiter des ajustements pour fonctionner dans votre environnement spécifique.

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