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

SQL Server中移除NVARCHAR字段JSON字符串重复名称条目

在SQL Server中保留原顺序移除NVARCHAR字段内JSON重复名称条目

原查询的问题是用了ORDER BY (select NULL),排序逻辑不确定,导致输出的JSON数组打乱了原始顺序。要实现保留原始顺序、移除重复name条目(保留第一个出现的条目),关键是利用OPENJSON返回的数组索引(key列)来锚定原始顺序,具体实现如下:

正确SQL查询语句

SELECT 
    Id,
    (
        SELECT [Name], [Age]
        FROM (
            -- 先解析JSON数组,保留每个元素的原始索引key
            SELECT 
                parsed.[Name],
                parsed.[Age],
                -- 按原始出现顺序给同name的条目编号
                ROW_NUMBER() OVER (
                    PARTITION BY parsed.[Name] 
                    ORDER BY CAST(arr.[key] AS INT)
                ) AS row_num,
                arr.[key]
            FROM OPENJSON(PeopleJson) arr
            -- 解析每个数组元素的具体字段
            CROSS APPLY OPENJSON(arr.[value]) WITH (
                [Name] NVARCHAR(1000),
                [Age] INT
            ) parsed
        ) filtered
        WHERE filtered.row_num = 1
        -- 按原始索引排序,保证输出顺序和原数组一致
        ORDER BY CAST(filtered.[key] AS INT)
        FOR JSON PATH, INCLUDE_NULL_VALUES
    ) AS [People]
FROM [TestTable]

核心逻辑说明

  • 捕获原始顺序:OPENJSON(PeopleJson)会返回数组中每个元素的key(字符串类型的索引,从0开始),将其转为INT后就能代表元素的原始位置。
  • 精准去重:通过ROW_NUMBER()按Name分组,再按原始索引排序,给每个分组内的条目编号,只保留编号为1的条目(即该名称第一次出现的条目)。
  • 维持输出顺序:生成JSON前再次按原始索引排序,确保最终输出的JSON数组顺序和原数据完全一致。

内容的提问来源于stack exchange,提问作者Huso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:45:24