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

如何在 SQL 中连接逗号分隔的数据列?

Mary-Kate Olsen
发布: 2024-12-29 01:07:10
原创
454 人浏览过

How to Join Comma-Delimited Data Columns in SQL?

加入逗号分隔的数据列

挑战:

给定两个表,其中一个包含逗号分隔的数据列,任务是从表中检索数据并用逗号分隔显示结果每行的值连接成一个字符串。

解决方案:

标准化:

理想的方法是使用逗号分隔的数据列,消除了复杂的字符串操作的需要。通过创建一个新表,其中每个逗号分隔值成为一个新行,然后您可以轻松地在公共字段上连接表。

拆分函数:

如果规范化是不可能的,可以创建一个分割函数来将逗号分隔的值转换为可以连接的行。然后,可以使用此函数将数据保留在多行中,或将值连接回逗号分隔的列表中。

对于 XML PATH 和 STUFF:

或者,您可以使用 FOR XML PATH 和 STUFF 技术来检索数据。 FOR XML PATH 会将逗号分隔的值转换为 XML,并且可以使用 STUFF 将 XML 连接成单个字符串。

直接 FOR XML PATH 应用:

最后一种方法是将 FOR XML PATH 直接应用于数据列。通过选择所需的列并使用适当的查询,您可以检索以逗号分隔的值并将它们聚合为单个字符串。

实现详细信息:

根据选择的方法,实现会有所不同。以下示例简要概述了如何实现每种方法:

标准化:

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, '');
登录后复制

分割函数:

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, '');
登录后复制

对于 XML 路径和STUFF:

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;
登录后复制

通过选择适当的方法并实现必要的代码,您可以有效地将逗号分隔的数据连接到表中每一行的单个字符串中。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板