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
相关产品推荐
相关产品推荐

