如何在SQL Server中从JSON数组移除指定元素?
在SQL Server中移除JSON数组的指定元素
针对你提出的JSON数组元素移除需求,这里提供两种实用的实现方案:
方法1:拆解数组+过滤+重组(推荐处理单/多元素移除)
这种方法通用性最强,不管是移除单个还是多个元素都能轻松处理,核心思路是把JSON数组拆成行数据,过滤掉目标元素后再重新聚合为JSON数组。
假设你的表名为YourTable,JSON列名为JsonArrayCol,主键列是Id:
移除单个元素(示例:移除"3")
UPDATE YourTable SET JsonArrayCol = ( SELECT JSON_QUOTE(value) AS [value] FROM OPENJSON(JsonArrayCol) WHERE value != '3' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) WHERE Id = 1; -- 指定要更新的目标行
移除多个元素(示例:移除"2"和"4")
用NOT IN过滤多个目标元素即可:
UPDATE YourTable SET JsonArrayCol = ( SELECT JSON_QUOTE(value) AS [value] FROM OPENJSON(JsonArrayCol) WHERE value NOT IN ('2', '4') FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) WHERE Id = 1;
如果需要确保过滤后空结果显示为[]而非NULL,可以加ISNULL判断:
UPDATE YourTable SET JsonArrayCol = ISNULL(( SELECT JSON_QUOTE(value) AS [value] FROM OPENJSON(JsonArrayCol) WHERE value NOT IN ('2', '4') FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ), '[]') WHERE Id = 1;
方法2:用JSON_MODIFY移除单个元素(仅适合已知索引的场景)
如果仅需移除单个元素,且明确知道该元素在数组中的索引(从0开始计数),可以用JSON_MODIFY直接将对应位置设为NULL,但这种方式会留下null值,后续还需清理,实用性不如方法1。
示例:移除数组中第3个元素(索引2,对应值"3"):
UPDATE YourTable SET JsonArrayCol = JSON_MODIFY(JsonArrayCol, '$[2]', NULL) WHERE Id = 1;
补充说明
- 若你的SQL Server版本为2017及以上,也可以用
STRING_AGG替代FOR JSON实现数组重组,效果一致:
UPDATE YourTable SET JsonArrayCol = CONCAT('[', STRING_AGG(JSON_QUOTE(value), ','), ']') FROM YourTable CROSS APPLY OPENJSON(JsonArrayCol) WHERE value NOT IN ('2', '4') GROUP BY Id HAVING Id = 1;
- 操作前建议先执行
SELECT语句验证结果,确认无误后再执行UPDATE,避免误操作。
内容的提问来源于stack exchange,提问作者behzad
相关产品推荐
相关产品推荐

