[英]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.