在openjson SQL Server 2016

时间:2017-11-03 09:22:06

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

我想从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) 

1 个答案:

答案 0 :(得分:3)

以下是使用for jsonopen json的工作解决方案。重点是:

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

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

  3. 在SQL中轻松过滤的内容
  4. 将它全部组装回原始JSON。这是由FOR JSON AUTO

  5. 完成的

    请牢记此类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 
    ))