删除 JSON 数组中的重复值

问题描述 投票:0回答:1

我在 SQL Server 表的字段中具有此值:

["I3","I23","B1","B3","B2","B4","B6","I1","I11","I4","I14","I24","I34","I5","I15","I25","I35","I6","I16","I26","I36","I21","B5","I31","I11","I3","I1","I31","I21","I21","I5","I4","I3","I21","I4","I23","B1","I23","I3","B1","B2","B3","I15","I15","B2","I13","I2"]

其实是一个

JSON Array

某些值出现超过 1 次:我需要删除重复的

(keeping first occurrence)
因此结果应该是这样的:

["I3","I23","B1","B3","B2","B4","B6","I1","I11","I4","I14","I24","I34","I5","I15","I25","I35","I6","I16","I26","I36","I21","B5","I31","I13","I2"]

我已经尝试了几种解决方案,我似乎接近解决方案,但在最佳解决方案中,我得到的结果是对象数组而不是值数组:

[
     {
        "c": "B1"
     },
     {
        "c": "B2"
     },
     {
        "c": "B3"
     },
     {
        "c": "B4"
     },
     {
        "c": "B5"
     },
     {
        "c": "B6"
     },
     {
        "c": "I1"
     },
     {
        "c": "I11"
     },
     {
        "c": "I13"
     },
     {
        "c": "I14"
     },
     {
        "c": "I15"
     },
     {
        "c": "I16"
     },
     {
        "c": "I2"
     },
     {
        "c": "I21"
     },
     {
        "c": "I23"
     },
     {
        "c": "I24"
     },
     {
        "c": "I25"
     },
     {
        "c": "I26"
     },
     {
        "c": "I3"
     },
     {
        "c": "I31"
     },
     {
        "c": "I34"
     },
     {
        "c": "I35"
     },
     {
        "c": "I36"
     },
     {
        "c": "I4"
     },
     {
        "c": "I5"
     },
     {
        "c": "I6"
     }
  ]

我该如何修复它?

json sql-server t-sql sql-server-2017
1个回答
0
投票

您需要使用

OPENJSON
分解您的值,使用
GROUP BY
删除重复项(取最小值
key
来保留顺序
) then aggregate them back up using 
STRING_AGG`,所以像这样:

DECLARE @T TABLE (JsonArray NVARCHAR(MAX));
INSERT @T (JsonArray) 
VALUES ('["I3","I23","B1","B3","B2","B4","B6","I1","I11","I4","I14","I24","I34","I5","I15","I25","I35","I6","I16","I26","I36","I21","B5","I31","I13","I2"]');

SELECT  t.JsonArray,
        DistinctArray = JSON_QUERY(CONCAT('[', STRING_AGG(QUOTENAME(oj.Value,'"'), ',') WITHIN GROUP (ORDER BY oj.[Key]), ']'))
FROM    @T AS t
        CROSS APPLY 
        (   SELECT  oj.Value, [Key] = MIN(oj.[Key])
            FROM    OPENJSON(t.JsonArray) AS oj
            GROUP BY oj.Value
        ) AS oj
GROUP BY t.JsonArray;

db<>fiddle 的示例

© www.soinside.com 2019 - 2024. All rights reserved.