Одним из возможных подходов к удалению дубликатов являются следующие шаги:
- Синтаксический анализ
Categories
JSON массивов из входных данных JSON как таблицы с использованием OPENJSON()
с явной схемой - Преобразуйте отдельные строки в JSON, используя
FOR JSON AUTO
- Измените массивы
Categories
JSON с помощью нового JSON, используя JSON_MODIFY()
:
Конечно, вам нужно как минимум SQL Server 2016, чтобы использовать встроенную поддержку JSON.
JSON:
DECLARE @json nvarchar(max) = N'{
"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",
"IsEnable": true,
"Priority": 0
},
{
"GDSName": "Type2_test3",
"IsEnable": true,
"Priority": 0
}
]
},
{
"Type": "Type3",
"GDS": [
{
"GDSName": "Type3_test3",
"IsEnable": true,
"Priority": 0
}
]
}
]
}'
Заявление:
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