Maison > base de données > tutoriel mysql > Comment joindre des colonnes de données délimitées par des virgules dans SQL ?

Comment joindre des colonnes de données délimitées par des virgules dans SQL ?

Mary-Kate Olsen
Libérer: 2024-12-29 01:07:10
original
454 Les gens l'ont consulté

How to Join Comma-Delimited Data Columns in SQL?

Joindre une colonne de données délimitées par des virgules

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.

Solution :

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.

Détails de mise en œuvre :

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, '');
Copier après la connexion

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, '');
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal