【问题标题】:Delete an object from nested array in openjson SQL Server 2016从openjson SQL Server 2016中的嵌套数组中删除对象
【发布时间】:2017-11-03 09:22:05
【问题描述】:

我想从 SQL Server 2016 中的以下 json 中删除 "AttributeName" : "Manufacturer"

declare @json nvarchar(max) = '[{"Type":"G","GroupBy":[],
"Attributes":[{"AttributeName":"Class Designation / Compressive Strength"},{"AttributeName":"Size"},{"AttributeName":"Manufacturer"}]}]'

这是我尝试过的查询,但不起作用

select JSON_MODIFY((
select JSON_Query(@json, '$[0].Attributes') as res),'$.AttributeName.Manufacturer', null) 

【问题讨论】:

    标签: sql-server sql-server-2016 json-query


    【解决方案1】:

    这是使用for jsonopen json 的有效解决方案。重点是:

    1. 确定要删除的项目并将其替换为 NULL。这是由JSON_MODIFY(@json,'$[0].Attributes[2]', null) 完成的。我们只是说,将Attributes 中的第二个元素替换为null

    2. 将此数组转换为行集。我们需要以某种方式摆脱这个null 元素,这是我们可以通过where [value] is not null 在SQL 中轻松过滤的东西

    3. 将其全部组装回原始 JSON。这是由FOR JSON AUTO 完成的

    请记住这种 JSON 数据转换的一个重要方面:

    JSON 是为信息交换或最终存储信息而设计的。但是您应该避免在 SQL 级别上进行更复杂的数据操作。

    无论如何,解决方法在这里:

    declare @json nvarchar(max) = '[{"Type": "G","GroupBy": [],"Attributes": [{"AttributeName": "Class Designation / Compressive Strength"}, {"AttributeName": "Size"}, {"AttributeName": "Manufacturer"}]}]';            
    
    with src as
    (
        SELECT * FROM OPENJSON(
            JSON_Query(
                JSON_MODIFY(@json,'$[0].Attributes[2]', null) , '$[0].Attributes'))
    )
    select JSON_MODIFY(@json,'$[0].Attributes', (
        select JSON_VALUE([value], '$.AttributeName') as [AttributeName] from src
        where [value] is not null
        FOR JSON AUTO 
    )) 
    

    【讨论】:

    • 这很酷。按预期工作。一个小的澄清,在实际场景中,我只知道要删除的 AttributeName = Manufacturer 而不是它的 Index as 2 "JSON_MODIFY(@json,'$[0].Attributes[2]', null)"。
    • @Jebin 你看 :) 将转换逻辑移到其他地方的另一个原因。会越来越痛苦。无论如何,唯一的出路是用 subselect 替换 [2] 索引。一个查询将通过其属性名称值找到元素索引。
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2019-03-07
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多