从SQL Server中删除重复的JSON节点

从SQL Server中删除重复的JSON节点,json,sql-server,duplicates,Json,Sql Server,Duplicates,我想删除SQL Server表列中JSON中的重复节点 JSON列: { "Categories": [ { "Type": "Type1", "GDS": [ { "GDSName": "Type1_test1", "IsEnable": true, "Priority":

我想删除SQL Server表列中JSON中的重复节点

JSON列:

{
    "Categories": [
        {
            "Type": "Type1",
            "GDS": [
                {
                    "GDSName": "Type1_test1",
                    "IsEnable": true,
                    "Priority": 2
                },
                {
                    "GDSName": "Type1_test2",
                    "IsEnable": false,
                    "Priority": 0
                }
            ]
        },
        {
            "Type": "Type2",
            "GDS": [
                {
                    "GDSName": "Type2_test1",
                    "IsEnable": false,
                    "Priority": 0
                },
                {
                    "GDSName": "Type2_test2",
                    "IsEnable": true,
                    "Priority": 0
                },
                {
                    "GDSName": "Type2_test3",//this is duplicate,keep this
                    "IsEnable": true,
                    "Priority": 0
                },
                {
                    "GDSName": "Type2_test3",//this is duplicate ,delete this
                    "IsEnable": true,
                    "Priority": 0
                }
            ]
        },
        {
            "Type": "Type3",
            "GDS": [
                {
                    "GDSName": "Type3_test3",
                    "IsEnable": true,
                    "Priority": 0
                }
            ]
        }
    ]
}
在这里

"Type": "Type2",
"GDS [2] & [3] of GDSName": "Type2_test3"
都是重复的


我需要确保Type2_test3是否存在并且是多个,然后通过在每列保留Type2_test3单个条目来删除重复条目。

删除重复条目的一种可能方法是以下步骤:

  • 使用带有显式模式的
    OPENJSON()
    从输入JSON as表解析
    类别
    JSON数组
  • 使用JSON AUTO的
    将不同的行输出为JSON
  • 使用
    JSON\u Modify()
    ,使用新的JSON修改
    类别
    JSON数组:
当然,至少需要SQL Server 2016才能使用内置JSON支持

JSON:

声明:

CREATE TABLE Data (JsonColumn nvarchar(max))
INSERT INTO Data (JsonColumn) VALUES (@json)

UPDATE Data
SET JsonColumn = JSON_MODIFY(
   JsonColumn,
   '$.Categories',
   (
   SELECT j.[Type], a.GDS
   FROM OPENJSON(JsonColumn, '$.Categories') WITH (
      [Type] varchar(10) '$.Type',
      [GDS] nvarchar(max) '$.GDS' AS JSON
   ) j
   CROSS APPLY (
      SELECT DISTINCT GDSName, IsEnable, Priority
      FROM OPENJSON(j.GDS) WITH (
         GDSName varchar(50) '$.GDSName',
         IsEnable bit '$.IsEnable',
         Priority int '$.Priority'
      )
      FOR JSON PATH
   ) a (GDS)
   FOR JSON AUTO
   )
)

SELECT *
FROM Data
CREATE TABLE Data (JsonColumn nvarchar(max))
INSERT INTO Data (JsonColumn) VALUES (@json)

UPDATE Data
SET JsonColumn = JSON_MODIFY(
   JsonColumn,
   '$.Categories',
   (
   SELECT j.[Type], a.GDS
   FROM OPENJSON(JsonColumn, '$.Categories') WITH (
      [Type] varchar(10) '$.Type',
      [GDS] nvarchar(max) '$.GDS' AS JSON
   ) j
   CROSS APPLY (
      SELECT DISTINCT GDSName, IsEnable, Priority
      FROM OPENJSON(j.GDS) WITH (
         GDSName varchar(50) '$.GDSName',
         IsEnable bit '$.IsEnable',
         Priority int '$.Priority'
      )
      FOR JSON PATH
   ) a (GDS)
   FOR JSON AUTO
   )
)

SELECT *
FROM Data