0

我有一个类似(简化)的查询:

SELECT 
    JSON_QUERY(r.SerializedData, '$.Values') AS [Values] 
FROM 
    <TABLE> r 
WHERE ...

结果是这样的:

{ "2019":120, "20191":120, "201902":121, "201903":134, "201904":513 }

如何删除密钥长度小于 6 的条目。

结果:

   { "201902":121, "201903":134, "201904":513 }
4

1 回答 1

0

一种可能的解决方案是解析 JSON 并使用字符串操作对具有所需长度的键再次生成它:

桌子:

CREATE TABLE Data (SerializedData nvarchar(max))
INSERT INTO Data (SerializedData) 
VALUES (N'{"Values": { "2019":120, "20191":120, "201902":121, "201903":134, "201904":513 }}')

声明(适用于 SQL Server 2017+):

UPDATE Data
SET SerializedData = JSON_MODIFY(
   SerializedData,
   '$.Values',
   JSON_QUERY(
      (
      SELECT CONCAT('{', STRING_AGG(CONCAT('"', [key] ,'":', [value]), ','), '}')
      FROM OPENJSON(SerializedData, '$.Values') j
      WHERE LEN([key]) >= 6
      )
   )
)

SELECT JSON_QUERY(d.SerializedData, '$.Values') AS [Values]
FROM Data d

结果:

Values
{"201902":121,"201903":134,"201904":513}

笔记:

重要的是要注意,如果新值是并且指向 JSON 对象JSON_MODIFY()lax模式会删除指定的值。但是,在这种特定情况下(具有可变键名的 JSON 对象),我更喜欢上述解决方案。keyNULLpath

于 2020-04-01T10:58:11.797 回答