挑战:
给定两个表,其中一个包含逗号分隔的数据列,任务是从表中检索数据并用逗号分隔显示结果每行的值连接成一个字符串。
标准化:
理想的方法是使用逗号分隔的数据列,消除了复杂的字符串操作的需要。通过创建一个新表,其中每个逗号分隔值成为一个新行,然后您可以轻松地在公共字段上连接表。
拆分函数:
如果规范化是不可能的,可以创建一个分割函数来将逗号分隔的值转换为可以连接的行。然后,可以使用此函数将数据保留在多行中,或将值连接回逗号分隔的列表中。
对于 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中文网其他相关文章!