我有这个JSON字符串:

[
  {
    "Name": "TGName",
    "Value": ""
  },
  {
    "Name": "ISD",
    "Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
  }
]

在本JSON中,"类别"键的值需要从"EPR氧气"更新为"阻尼器".

我编写了这个查询,以从JSON上方获取值=EPR OOORT,并获得了该值:

CREATE TABLE SomeTempAVI (input nvarchar(max))

DECLARE @inputWiCate nvarchar(max)='[
  {
    "Name": "TGName",
    "Value": ""
  },
  {
    "Name": "ISD",
    "Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
  }
]'

INSERT INTO SomeTempAVI 
    SELECT VALUE 
    FROM OPENJSON (@inputWiCate)
    WITH (Name nvarchar(100), Value nvarchar(max))  
    WHERE name = 'ISD'

DECLARE @inputValue nvarchar(max)

SELECT @inputValue = Category 
FROM OPENJSON ((SELECT TOP 1 input FROM SomeTempAVI))
     WITH (SIData NVARCHAR(MAX)  AS JSON) a
CROSS APPLY OPENJSON(a.SIData)
            WITH (row NVARCHAR(MAX)  AS JSON) b  
CROSS APPLY OPENJSON(b.row) 
            WITH (Category NVARCHAR(MAX) '$.Category') c 

PRINT @inputValue

DROP TABLE SomeTempAVI

但我不知道如何将该值更新为"Damper".

有没有人能帮我一下?

推荐答案

以下代码应该可以为您工作.您需要使用FOR JSON重新构建JSON数组,使用原始的Value属性或修改后的Value属性,具体取决于您的条件.

不幸的是,内部对象是双重编码的,这使事情变得复杂.由于某些原因,SQL Server没有正确地重新编码它.首先,您可能想要调查为什么它是双重编码的.

请注意,临时表是不必要的

DECLARE @inputWiCate nvarchar(max)='[
  {
    "Name": "TGName",
    "Value": ""
  },
  {
    "Name": "ISD",
    "Value": "{\"WC\":{\"IL\":\"false\",\"SCB\":\"false\"},\"RC\":[{\"PrimaryKeys\":\"\",\"BackupMode\":\"NONE\"}],\"SIData\":{\"builderId\":\"4567\",\"row\":{\"Category\":\"Epr Oxygen\",\"EP_Key\":\"5678\"}}}"
  }
]'

SELECT
  j1.Name,
  Value = CASE WHEN j1.Name = 'ISD'
       THEN JSON_MODIFY(j1.value, '$.SIData.row.Category', 'Damper')
       ELSE j1.Value
       END
FROM OPENJSON (@inputWiCate)
  WITH (
    Name nvarchar(100),
    Value nvarchar(max)
  ) j1
FOR JSON PATH;

db<>fiddle

如果Value不是双重编码的,则将上面的代码更改如下

FROM OPENJSON (@inputWiCate)
  WITH (
    Name nvarchar(100),
    Value nvarchar(max) AS JSON
  ) j1

Sql相关问答推荐

Postgresql -如何计算刷卡和刷卡时间

如何使用PostGIS从单个表中 Select 所有相交面组

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

出现5次后,将所有正斜杠替换为连字符

在Golang中管理数据库事务的简洁方法

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

SQL:如何取上一年的平均值?

SQL计数条目大于日期,包括交叉表中的零

按两列分组,并根据SQL中的条件返回第三个列值

如何使用聚合连接两个表

列(值不为空)到其他有序列

清理 XML 数据

snowflake中的动态文件名生成

SQL for Smarties 类型问题:从表中 Select 记录,并对某些值进行分组

如何显示最常引用条目的详细信息

PostgreSQL - 递归地聚合来自不同列的属性

函数调用作为插入值语句中的参数

使用 R 遍历 SQL 查询,每次替换一个变量

超过100名员工的连续行

如何跨行合并以删除 SQL 中的空值?