将 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 列中的分隔值拆分为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!