Home >Database >Mysql Tutorial >How to Join Comma-Delimited Data Columns from Two Tables?

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

Linda Hamilton
Linda HamiltonOriginal
2025-01-03 15:31:39974browse

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

Joining Comma-Delimited Data Columns

Data tables often contain comma-separated values within cells. Extracting and normalizing these values can be crucial for further data analysis. In this article, we will explore techniques to join comma-delimited data in two tables and present the results in a consolidated format.

Consider the following two tables:

Table 1 (T1)

col1 col2
C1 john
C2 alex
C3 piers
C4 sara

Table 2 (T2)

col1 col2
R1 C1,C2,C4
R2 C3,C4
R3 C1,C4

Desired Result:

col1 col2
R1 john,alex,sara
R2 piers,sara
R3 john,sara

Solutions:

Normalization:

The ideal solution is to normalize Table 2 by splitting the comma-separated values into a separate relation. This would create a new table with two columns: col1 and col2, where each row represents a value previously stored in the col2 column of Table 2.

Join with Subquery (FOR XML PATH):

If normalization is not feasible, we can use a subquery along with the FOR XML PATH clause to retrieve the comma-separated values as a single 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;

Join with Split Function:

Alternatively, we can create a user-defined function called Split to extract individual values from the comma-delimited string.

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;

Using the Split function, we can either store the individual values in separate rows or concatenate them back into a comma-separated string.

The above is the detailed content of How to Join Comma-Delimited Data Columns from Two Tables?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn