首页 >数据库 >mysql教程 >如何连接两个表中的逗号分隔数据列?

如何连接两个表中的逗号分隔数据列?

Linda Hamilton
Linda Hamilton原创
2025-01-03 15:31:39974浏览

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

连接逗号分隔的数据列

数据表通常在单元格内包含逗号分隔的值。提取和标准化这些值对于进一步的数据分析至关重要。在本文中,我们将探索连接两个表中逗号分隔数据并以统一格式呈现结果的技术。

考虑以下两个表:

表 1 ( T1)

col1 col2
C1 john
C2 alex
C3 piers
C4 sara

表 2 (T2)

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

所需结果:

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

解决方案:

标准化:

理想的解决方案是标准化表 2通过将逗号分隔的值拆分为单独的关系。这将创建一个包含两列的新表:col1 和 col2,其中每一行代表先前存储在表 2 的 col2 列中的值。

使用子查询连接(对于 XML 路径):

如果规范化不可行,我们可以使用子查询和 FOR XML PATH 子句来检索逗号分隔的值作为单个值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;

与 Split 函数连接:

或者,我们可以创建一个名为 Split 的用户定义函数来从逗号分隔的字符串中提取单个值.

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;

使用 Split 函数,我们可以将各个值存储在单独的行中或连接起来将它们重新转换为逗号分隔的字符串。

以上是如何连接两个表中的逗号分隔数据列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn