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