从SQL Server中删除重复的JSON节点
我想删除SQL Server表列中JSON中的重复节点 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":
{
"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单个条目来删除重复条目。删除重复条目的一种可能方法是以下步骤:
- 使用带有显式模式的
从输入JSON as表解析OPENJSON()
JSON数组类别
- 使用JSON AUTO的
将不同的行输出为JSON
- 使用
,使用新的JSON修改JSON\u Modify()
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