Défi :
Étant donné deux tables, une avec des données séparées par des virgules colonne, la tâche consiste à récupérer les données des tables et à présenter les résultats avec les valeurs séparées par des virgules jointes en une seule chaîne pour chaque ligne.
Normalisation :
Une approche idéale serait de normaliser le tableau avec la colonne de données séparées par des virgules, en éliminant la nécessité de manipulations de chaînes complexes. En créant une nouvelle table où chaque valeur séparée par des virgules devient une nouvelle ligne, vous pouvez ensuite facilement joindre les tables sur un champ commun.
Fonction Split :
Si la normalisation n'est pas possible, une fonction de fractionnement peut être créée pour convertir les valeurs séparées par des virgules en lignes pouvant être jointes. Cette fonction peut ensuite être utilisée pour laisser les données sur plusieurs lignes ou pour concaténer les valeurs dans une liste séparée par des virgules.
POUR XML PATH et STUFF :
Vous pouvez également utiliser les techniques FOR XML PATH et STUFF pour récupérer les données. FOR XML PATH convertira les valeurs séparées par des virgules en XML, et STUFF peut être utilisé pour concaténer le XML en une seule chaîne.
Application directe FOR XML PATH :
Une dernière approche consiste à appliquer FOR XML PATH directement à la colonne de données. En sélectionnant les colonnes souhaitées et en utilisant la requête appropriée, vous pouvez récupérer les valeurs séparées par des virgules et les agréger en une seule chaîne.
En fonction de l'approche choisie, la mise en œuvre variera. Les exemples suivants donnent un bref aperçu de la façon dont chaque méthode peut être mise en œuvre :
Normalisation :
CREATE TABLE NormalizedTable ( id INT, value VARCHAR(255), ); INSERT INTO NormalizedTable (id, value) VALUES (1, 'john'), (2, 'alex'), (3, 'piers'), (4, 'sara'), (5, 'C1'), (6, 'C2'), (7, 'C3'), (8, 'C4'), (9, 'R1'), (10, 'R2'), (11, 'R3'); SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM NormalizedTable T1 INNER JOIN Table2 T2 ON T1.id = T2.col2 FOR XML PATH('') ), 1, 2, '');
Fonction de fractionnement :
CREATE FUNCTION dbo.Split (@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS TABLE AS RETURN WITH CTE AS ( SELECT 1 AS RowNum, @String AS Value UNION ALL SELECT RowNum + 1, SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) FROM CTE WHERE SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) <> '' ) SELECT RowNum, Value AS Item FROM CTE; -- Usage SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM ( SELECT DISTINCT Value AS col2 FROM dbo.Split(T2.col2, ',') ) T1 FOR XML PATH('') ), 1, 2, '');
POUR XML CHEMIN et TRUC :
SELECT T2.col1, ( SELECT ', ' + T1.col2 FROM Table1 T1 WHERE ',' + T2.col2 + ',' LIKE '%,' + CAST(T1.col1 AS VARCHAR(10)) + ',%' FOR XML PATH('') ).value('substring(text()[1], 3)', 'VARCHAR(MAX)') AS col2 FROM Table2 T2;
En sélectionnant l'approche appropriée et en implémentant le code nécessaire, vous pouvez efficacement joindre des données séparées par des virgules en une seule chaîne pour chaque ligne du tableau.
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!