SQL Server中去除字符串重复项并保留输入原始顺序的实现
实现保留原始顺序的字符串去重函数
当然可以实现!你的原始函数因为使用DISTINCT且未指定排序规则,SQL Server会默认按字典序返回结果,所以才会变成升序。要保留原始输入顺序,我们需要在拆分字符串时记录每个元素的出现位置,最后按这个位置排序拼接即可。
下面是修改后的函数:
CREATE FUNCTION [dbo].[DistinctListPreserveOrder] (@List VARCHAR(MAX), @Delim CHAR) RETURNS VARCHAR(MAX) AS BEGIN -- 新增RowNum字段记录元素的原始位置 DECLARE @ParsedList TABLE(Item VARCHAR(MAX), RowNum INT) DECLARE @list1 VARCHAR(MAX), @Pos INT, @rList VARCHAR(MAX), @currentRow INT = 1 SET @list = LTRIM(RTRIM(@list)) + @Delim SET @pos = CHARINDEX(@delim, @list, 1) WHILE @pos > 0 BEGIN SET @list1 = LTRIM(RTRIM(LEFT(@list, @pos - 1))) IF @list1 <> '' -- 插入时同时记录当前的位置序号 INSERT INTO @ParsedList VALUES (CAST(@list1 AS VARCHAR(MAX)), @currentRow) SET @list = SUBSTRING(@list, @pos+1, LEN(@list)) SET @pos = CHARINDEX(@delim, @list, 1) SET @currentRow = @currentRow + 1 END -- 先分组取每个元素第一次出现的位置,再按原始位置排序拼接 SELECT @rlist = COALESCE(@rlist+',','') + item FROM ( SELECT Item, MIN(RowNum) AS FirstOccurrence FROM @ParsedList GROUP BY Item ORDER BY FirstOccurrence ) t RETURN @rlist END
关键修改说明:
- 表变量
@ParsedList新增RowNum字段,用于存储每个元素在原始字符串中的出现顺序; - 拆分循环中维护
@currentRow变量,每处理一个元素就递增,确保位置序号准确; - 最终拼接时,通过
GROUP BY Item取每个元素第一次出现的最小位置,再按这个位置排序,保证输出顺序和输入一致。
测试你的示例:
执行以下代码:
DECLARE @code VARCHAR(MAX) = 'L02.226,L02.239,L02.12,L08.1,L02.232,L02.221,L02.224,L02.229,L02.232,L02.239' SELECT dbo.DistinctListPreserveOrder(@code, ',') AS Result
返回结果就是你期望的:L02.226,L02.239,L02.12,L08.1,L02.232,L02.221,L02.224,L02.229
内容的提问来源于stack exchange,提问作者ASHWANT
相关产品推荐
相关产品推荐

