我在 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"
}
]
我该如何修复它?
您需要使用
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;