Maison >base de données >tutoriel mysql >Comment puis-je diviser une seule colonne de plusieurs numéros d'abonnement en colonnes individuelles dans SQL ?

Comment puis-je diviser une seule colonne de plusieurs numéros d'abonnement en colonnes individuelles dans SQL ?

DDD
DDDoriginal
2024-12-17 01:47:24144parcourir

How can I split a single column of multiple subscription numbers into individual columns in SQL?

Diviser les numéros d'abonnement en plusieurs colonnes

Dans une situation où une seule colonne contient plusieurs valeurs, comme un numéro d'abonnement, diviser ces valeurs en colonnes individuelles peut être une technique de manipulation de données utile. Voici un guide étape par étape :

1. Fragmentation XML Cross Apply :

Cette approche utilise la fragmentation XML pour convertir le numéro d'abonnement en un document XML, permettant d'extraire les valeurs individuelles en tant que nœuds distincts.

Cross Apply (
    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
          ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
    From  (Select Cast('<x>' + replace((Select replace(replace(A.SomeCol,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
) B

Ici, xDim est l'élément de fragmentation qui convertit la chaîne du numéro d'abonnement en XML. Les nœuds résultants, numérotés x[1], x[2], etc., sont extraits dans les colonnes cibles.

2. Création d'une table à la volée :

Vous pouvez également créer la table cible de manière dynamique lors de l'exécution de la requête. Cela élimine le besoin d'une déclaration explicite de création de table au préalable.

Select A.PUB_FORM_NUM
      ,B.*
 Into  MyNewPubTable
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.PUB_FORM_NUM,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Cette approche crée MyNewPubTable et insère les valeurs du numéro d'abonnement fractionné directement dans les colonnes ciblées.

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