Joindre des colonnes de données délimitées par des virgules
Les tableaux de données contiennent souvent des valeurs séparées par des virgules dans les cellules. L’extraction et la normalisation de ces valeurs peuvent être cruciales pour une analyse plus approfondie des données. Dans cet article, nous explorerons les techniques pour joindre des données délimitées par des virgules dans deux tableaux et présenterons les résultats dans un format consolidé.
Considérez les deux tableaux suivants :
Tableau 1 ( T1)
col1 | col2 |
---|---|
C1 | john |
C2 | alex |
C3 | piers |
C4 | sara |
Tableau 2 (T2)
col1 | col2 |
---|---|
R1 | C1,C2,C4 |
R2 | C3,C4 |
R3 | C1,C4 |
Résultat souhaité :
col1 | col2 |
---|---|
R1 | john,alex,sara |
R2 | piers,sara |
R3 | john,sara |
Solutions :
Normalisation :
La solution idéale est de normaliser le tableau 2 en divisant les valeurs séparées par des virgules dans une relation distincte. Cela créerait une nouvelle table avec deux colonnes : col1 et col2, où chaque ligne représente une valeur précédemment stockée dans la colonne col2 du tableau 2.
Rejoindre avec une sous-requête (POUR XML PATH) :
Si la normalisation n'est pas réalisable, nous pouvons utiliser une sous-requête avec la clause FOR XML PATH pour récupérer les valeurs séparées par des virgules sous forme d'une seule string.
SELECT col1, ( SELECT ', '+t1.col2 FROM t1 WHERE ','+t2.col2+',' LIKE '%,'+CAST(t1.col1 AS VARCHAR(10))+',%' FOR XML PATH(''), TYPE ).value('substring(text()[1], 3)', 'VARCHAR(MAX)') AS col2 FROM t2;
Rejoindre avec la fonction Split :
Alternativement, nous pouvons créer une fonction définie par l'utilisateur appelée Split pour extraire des valeurs individuelles de la chaîne délimitée par des virgules. .
CREATE FUNCTION [dbo].[Split](@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS BEGIN DECLARE @idx INT; DECLARE @slice VARCHAR(8000); SELECT @idx = 1; IF LEN(@String) < 1 OR @String IS NULL RETURN; WHILE @idx != 0 BEGIN SET @idx = CHARINDEX(@Delimiter, @String); IF @idx != 0 SET @slice = LEFT(@String, @idx - 1); ELSE SET @slice = @String; IF (LEN(@slice) > 0) INSERT INTO @temptable(Items) VALUES (@slice); SET @String = RIGHT(@String, LEN(@String) - @idx); IF LEN(@String) = 0 BREAK; END RETURN; END;
En utilisant la fonction Split, nous pouvons soit stocker les valeurs individuelles dans des lignes séparées, soit les concaténer dans un chaîne séparée par des virgules.
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!