如何解决无需键即可从JSON数组中删除元素
我正在寻找一种可以从SQL Server中的JSON数组中删除元素的方法,我尝试使用JSON_MODIFY / OPENPATH,但是我似乎无法正确获取path参数。
下面是我要转换的示例:
[{"FieldName":"OrderStatusTypeId","FieldType":"Int32","ValueBefore":"8","ValueAfter":"10","Action":2},{"FieldName":"PatientReferenceNumber","FieldType":"String","ValueBefore":"","ValueAfter":"","Action":2}]
成为:
[{"FieldName":"OrderStatusTypeId","Action":2}]
基本上,我想删除数组的任何元素,其中Action
为2,而ValueBefore
和ValueAfter
字段相同。
这是我目前正在尝试做的测试,但我不断收到以下错误:
DECLARE @JSONData AS NVARCHAR(4000)
SET @JSONData = N'[{"FieldName":"OrderStatusTypeId",{"FieldName":"PoNumber",{"FieldName":"ReferringPhysicianName",{"FieldName":"InsuranceProvider",{"FieldName":"TreatmentId",{"FieldName":"RowVersion[6]","FieldType":"Byte","ValueBefore":"10","ValueAfter":"115",{"FieldName":"OrderStatusType.Id",{"FieldName":"OrderStatusType.Description","ValueBefore":"Delivered","ValueAfter":"Failed Logistics",{"FieldName":"OrderStatusType.IsSelectable","FieldType":"Boolean","ValueBefore":"False","ValueAfter":"True","Action":2}]'
SELECT @JSONData = JSON_MODIFY(@JSONData,'$',JSON_QUERY(
(
SELECT *
FROM OPENJSON(@JSONData,'$') WITH (
FieldName nvarchar(1000) '$.FieldName',FieldType nvarchar(1000) '$.FieldType',ValueBefore nvarchar(1000) '$.ValueBefore',ValueAfter nvarchar(1000) '$.ValueAfter',Action int '$.Action'
)
WHERE Action <> 2 AND ValueBefore <> ValueAfter
FOR JSON PATH
)
)
)
错误:
13616级第1州第4行的短信
在JSON_MODIFY的参数2中找到不受支持的JSON路径。
我正在寻找的预期输出是:
[{"FieldName":"OrderStatusTypeId","Action":2}]
如何确定正确的JSON Path值,我似乎在线上找到的所有示例都没有数组作为JSON字符串的根元素。
请注意,元素的顺序并不重要。
解决方法
您不必在这里使用JSON_MODIFY。您只需选择所需的数据作为表,对其进行过滤,然后将其重新编码为JSON。
docker build
并且JSON是
DECLARE @JSONData AS NVARCHAR(4000)
SET @JSONData = N'[{"FieldName":"OrderStatusTypeId","FieldType":"Int32","ValueBefore":"8","ValueAfter":"10","Action":2},{"FieldName":"PatientReferenceNumber","FieldType":"String","ValueBefore":"","ValueAfter":"",{"FieldName":"PoNumber",{"FieldName":"ReferringPhysicianName",{"FieldName":"InsuranceProvider",{"FieldName":"TreatmentId",{"FieldName":"RowVersion[6]","FieldType":"Byte","ValueBefore":"10","ValueAfter":"115",{"FieldName":"OrderStatusType.Id",{"FieldName":"OrderStatusType.Description","ValueBefore":"Delivered","ValueAfter":"Failed Logistics",{"FieldName":"OrderStatusType.IsSelectable","FieldType":"Boolean","ValueBefore":"False","ValueAfter":"True","Action":2}]'
set @JSONData =
(
SELECT *
FROM OPENJSON(@JSONData,'$') WITH (
FieldName nvarchar(1000) '$.FieldName',FieldType nvarchar(1000) '$.FieldType',ValueBefore nvarchar(1000) '$.ValueBefore',ValueAfter nvarchar(1000) '$.ValueAfter',Action int '$.Action'
)
WHERE not (Action = 2 and ValueBefore = ValueAfter)
FOR JSON PATH
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。