Maison > base de données > tutoriel mysql > Comment joindre des colonnes de données délimitées par des virgules à partir de deux tables ?

Comment joindre des colonnes de données délimitées par des virgules à partir de deux tables ?

Linda Hamilton
Libérer: 2025-01-03 15:31:39
original
1025 Les gens l'ont consulté

How to Join Comma-Delimited Data Columns from Two Tables?

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

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

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!

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