首页 >数据库 >mysql教程 >如何有效地将 SQL 列中的分隔值拆分为多行?

如何有效地将 SQL 列中的分隔值拆分为多行?

Patricia Arquette
Patricia Arquette原创
2025-01-01 12:47:11720浏览

How to Efficiently Split Delimited Values in a SQL Column into Multiple Rows?

将 SQL 列中的分隔值拆分为多行

处理单列中包含分隔值的表(例如收件人)时- 地址字段以分号 (;) 分隔,因此有必要将这些值拆分为多行以进行进一步处理或分析。本文探讨了使用 SQL 实现此目的的各种方法,特别关注优化性能和效率。

在 SQL Server 2016 中使用 STRING_SPLIT 函数

如果您使用 SQL Server 2016 或更高版本,您可以利用 STRING_SPLIT 函数有效地拆分分隔值。此函数的语法如下:

STRING_SPLIT(@list, @delimiter)

以下是如何使用 STRING_SPLIT 将收件人地址提取到单独的行中:

SELECT [message-id], value
FROM dbo.SourceData
CROSS APPLY STRING_SPLIT([recipient-address], ';') AS f;

为 Pre 创建拆分函数-SQL Server 2016 版本

适用于之前的 SQL Server 版本2016年,您可以创建自定义拆分功能。此类函数的一个示例是:

CREATE FUNCTION dbo.SplitStrings(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number),
        Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, 
        CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
        FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number)
    WHERE Number <= CONVERT(INT, LEN(@List))
        AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
    ) AS y);
GO

然后您可以使用此函数来分割分隔值,如下所示:

SELECT [message-id], f.Item
FROM dbo.SourceData
CROSS APPLY dbo.SplitStrings([recipient-address], ';') AS f;

优化和注意事项

为了确保最佳性能,请考虑以下提示:

  • 使用根据您的 SQL Server 版本选择适当的方法。
  • 避免使用 LIKE 运算符搜索分隔符,因为这可能效率低下。
  • 为收件人地址列建立索引以加快查找速度。
  • 将大数据集分成更小的块进行处理。
  • 使用 SQL Server 的批量插入机制将数据高效地导入到数据库。

以上是如何有效地将 SQL 列中的分隔值拆分为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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