You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:42