Maison > base de données > tutoriel mysql > Comment annuler le pivotement des valeurs séparées par des virgules en plusieurs lignes dans Db2 ?

Comment annuler le pivotement des valeurs séparées par des virgules en plusieurs lignes dans Db2 ?

Linda Hamilton
Libérer: 2024-12-25 15:21:10
original
668 Les gens l'ont consulté

How to Unpivot Comma-Separated Values into Multiple Rows in Db2?

Comment convertir des colonnes séparées par des virgules en plusieurs lignes dans Db2

De nombreuses applications nécessitent que les données soient stockées dans une structure de table relationnelle, où chaque enregistrement représente une entité unique et ses attributs. Cependant, les données peuvent parfois être structurées différemment, par exemple dans un format séparé par des virgules au sein d'une seule colonne. Transformer de telles données en une structure relationnelle peut s'avérer difficile, mais Db2 propose une solution utilisant du SQL récursif.

Prenons un exemple dans lequel une table contient une colonne avec des valeurs séparées par des virgules :

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

Notre objectif est de transformer ces données en un tableau à plusieurs lignes, où chaque ligne représente une référence distincte :

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

Le La requête SQL récursive ci-dessous réalise cette transformation :

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

Cette requête annule le pivotement et divise de manière itérative les valeurs séparées par des virgules en lignes distinctes. Le résultat est une table relationnelle au format souhaité. Remarque : la requête n'a pas été testée et peut nécessiter des ajustements mineurs.

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