簡體   English   中英

按條件從 json 數組中刪除元素 sql server 2016

[英]Remove element from json array by condition sql server 2016

我有以下json數據

DECLARE @JSONData AS NVARCHAR(4000)  
SET @JSONData = N'{  
        "FirstName":"Jignesh",  
        "LastName":"Trivedi",  
        "Code":"CCEEDD",  
        "Addresses":[  
            { "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat"},  
            { "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"}  
        ]  
    }'

我需要從具有條件的數組中刪除元素(使用其他 sql server 2016 函數的 json_modify),例如我想刪除值為“Test 1”的地址。 有人可以幫忙嗎?

解決方案:

JSON_MODIFY()不支持path參數中的delete選項,因此這里一種可能的方法是清空"Addresses" JSON 數組,然后用匹配項填充該數組。 對於 SQL Server 2016+,您可以嘗試生成並執行動態語句。 如果您使用 SQL Server 2017+,則可以將變量作為path參數傳遞。

SQL Server 2016+ 示例:

DECLARE @JSONData AS NVARCHAR(4000)  
SET @JSONData = N'{  
   "FirstName":"Jignesh",  
   "LastName":"Trivedi",  
   "Code":"CCEEDD",  
   "Addresses":[  
       { "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 2", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 3", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 4", "City":"Gandhinagar", "State":"Gujarat"}  
   ]  
}'

DECLARE @JSONOutput AS NVARCHAR(4000)    
SELECT @JSONOutput = JSON_MODIFY(@JSONData, '$.Addresses', JSON_QUERY('[]'))

DECLARE @stm nvarchar(max) = N''
SELECT @stm = @stm + CONCAT(
   'SELECT @JSONOutput = JSON_MODIFY(@JSONOutput, ''append $.Addresses'', JSON_QUERY(@JSONData, ''$.Addresses[',
   [key],
   ']'')); '
)
FROM OPENJSON(@JSONData, '$.Addresses')
WHERE JSON_VALUE([value], '$.Address') <> N'Test 1'

EXECUTE sp_executesql @stm, N'@JSONOutput AS NVARCHAR(4000) OUTPUT, @JSONData AS NVARCHAR(4000)', @JSONOutput OUTPUT, @JSONData
PRINT @JSONOutput

SQL Server 2017+ 示例:

DECLARE @JSONData AS NVARCHAR(4000)  
SET @JSONData = N'{  
   "FirstName":"Jignesh",  
   "LastName":"Trivedi",  
   "Code":"CCEEDD",  
   "Addresses":[  
       { "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 2", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 3", "City":"Gandhinagar", "State":"Gujarat"},  
       { "Address":"Test 4", "City":"Gandhinagar", "State":"Gujarat"}  
   ]  
}'

DECLARE @JSONOutput AS NVARCHAR(4000)    
SELECT @JSONOutput = JSON_MODIFY(@JSONData, '$.Addresses', JSON_QUERY('[]'))
SELECT @JSONOutput = JSON_MODIFY(@JSONOutput, 'append $.Addresses', JSON_QUERY(@JSONData, '$.Addresses[' + [key] + ']'))
FROM OPENJSON(@JSONData, '$.Addresses')
WHERE JSON_VALUE([value], '$.Address') <> N'Test 1'

更新:

如果"Addresses"項具有固定結構,另一種可能的選擇是使用OPENJSON()FOR JSON PATH

SELECT @JSONData = JSON_MODIFY(
   @JSONData,
   '$.Addresses',
   JSON_QUERY(
      (
      SELECT *
      FROM OPENJSON(@JSONData, '$.Addresses') WITH (
         Address nvarchar(1000) '$.Address',
         City nvarchar(1000) '$.City',
         State nvarchar(1000) '$.State'
      )
      WHERE Address <> N'Test 1'
      FOR JSON PATH
      )
   )
)

我們可以打開 Json 然后刪除該值並替換新的 json 值,如下所示:

DECLARE @JSONData AS NVARCHAR(4000)  
SET @JSONData = N'{  
        "FirstName":"Jignesh",  
        "LastName":"Trivedi",  
        "Code":"CCEEDD",  
        "Addresses":[  
            { "Address":"Test 0", "City":"Gandhinagar", "State":"Gujarat"},  
            { "Address":"Test 1", "City":"Gandhinagar", "State":"Gujarat"}  
        ]  
    }'
            

    SELECT @JSONData=(SELECT oj.FirstName 'FirstName',oj.LastName 'LastName',oj.Code,JSON_VALUE(oj2.Value,'$.Address') AS 'Addresses.Address',JSON_VALUE(oj2.Value,'$.City')  'Addresses.City',
    JSON_VALUE(oj2.Value,'$.State') AS 'Addresses.State' FROM 
    OPENJSON(@JSONData)
    WITH 
    (FirstName NVARCHAR(max),LastName NVARCHAR(max),Code NVARCHAR(max),Addresses NVARCHAR(max) AS JSON)oj
    CROSS APPLY OPENJSON(oj.Addresses) oj2
    WHERE JSON_VALUE(oj2.Value,'$.Address')<>'Test 1'
    FOR JSON PATH)
        PRINT @JSONData

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM