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 ?
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!