Maison >base de données >tutoriel mysql >Comment puis-je diviser une valeur de colonne unique contenant plusieurs valeurs en plusieurs colonnes dans SQL Server ?

Comment puis-je diviser une valeur de colonne unique contenant plusieurs valeurs en plusieurs colonnes dans SQL Server ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-23 19:13:09218parcourir

How can I split a single column value containing multiple values into multiple columns in SQL Server?

Diviser une valeur de colonne unique en plusieurs colonnes

La tâche de diviser une seule colonne contenant plusieurs valeurs en colonnes distinctes peut survenir dans la gestion des données . Par exemple, considérons une table avec une colonne nommée « SubscriptionNumber » qui stocke les détails de l'abonnement dans un seul champ. Pour rendre les données plus gérables et accessibles, nous devons extraire les valeurs individuelles dans plusieurs colonnes.

Approche utilisant Cross Apply et XML

Une méthode pour y parvenir est en utilisant une technique d'application croisée et de manipulation XML. Supposons que nous ayons un tableau appelé « Abonnements » avec une colonne « SubscriptionNumber ». Les exemples de données dans cette colonne sont les suivants :

SC 5-1395-174-25P 
SC 1-2134-123-ABC C1-2
SC 12-5245-1247-14&P
SC ABCD-2525-120

Pour diviser ces valeurs en colonnes distinctes, nous pouvons utiliser la requête suivante :

Declare @YourTable table (SubscriptionNumber varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&P'),
('SC ABCD-2525-120')

Select B.*
 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.SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Cette requête utilise une application croisée à générer un ensemble de lignes pour chaque ligne de la table @YourTable. Dans l'application croisée, le type de données XML est utilisé pour convertir la valeur SubscriptionNumber en un fragment XML. Le fragment XML est ensuite analysé pour extraire les valeurs individuelles et les affecter aux colonnes Pos1 à Pos7.

Approche alternative utilisant Dynamic SQL

Une approche SQL dynamique peut également être utilisé pour diviser la colonne SubscriptionNumber en plusieurs colonnes. Cette approche nécessite la création d'une table temporaire pour stocker les valeurs fractionnées :

Declare @YourTable table (SubscriptionNumber varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&amp;P'),
('SC ABCD-2525-120')

Declare @ColNames nvarchar(max) = ''
Declare @SQL nvarchar(max) = 'CREATE TABLE #TempTable (SubscriptionNumber varchar(max), '

-- Generate column names dynamically
Select @ColNames += ', Col' + CAST(Row_Number() OVER (ORDER BY (SELECT NULL)) AS nvarchar(10))
From (Select * From @YourTable) AS T
Cross Join (Select * From @YourTable) AS T2

-- Append column names to SQL statement
Set @SQL += @ColNames + ')'

-- Execute the dynamic SQL to create the temporary table
Exec (@SQL)

-- Insert split values into the temporary table
Insert Into #TempTable
Select SubscriptionNumber,
       ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
From @YourTable
Cross Apply (
                Select Cast('<x>' + replace((Select replace(replace(SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 

-- Select data from the temporary table
Select * From #TempTable

L'approche SQL dynamique génère dynamiquement l'instruction SQL pour créer une table temporaire avec les noms de colonnes appropriés. Les valeurs fractionnées sont ensuite insérées dans cette table temporaire et les données peuvent être sélectionnées dans la table temporaire selon les besoins.

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