SQL Server 如何使用JSON_MODIFY更新包含JSON数据的列中的键

ckx4rj1h  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(176)

是否可以使用JSON_MODIFY更改JSON密钥?
使用这里显示的数据示例,我希望更改列JsonData中的键(而不是值),其中一行数据的键为Day,而另一行的键为DayOfWeek
我想更新这一行,并将键从Day更改为DayOfWeek,最终结果是该表应该包含JSON数据,其中所有行都具有键DayOfWeekTime
表格:

CREATE TABLE TempTbl 
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    JsonData nvarchar(max)
)

INSERT INTO TempTbl (JsonData)
VALUES 
   ('[{"Day":1,"Time":6},{"Day":2,"Time":11},{"Day":3,"Time":16}]'),
   ('[{"DayOfWeek":0,"Time":6},{"DayOfWeek":1,"Time":6}]')

SELECT语句示例:

SELECT 
    ID,
    JSonData,
    [Day],
    [DayOfWeek],
    [Time]
FROM 
    TempTbl
CROSS APPLY 
    OPENJSON(JsonData)
    WITH (  
          [Day] int '$.Day',
          [DayOfWeek] int '$.DayOfWeek',
          [Time] int '$.Time'
         )
WHERE
    [Day] IS NOT NULL

位于TempTbl.JsonData列中的新数据的预期结果:

('[{"DayOfWeek":1,"Time":6},{"DayOfWeek":2,"Time":11},{"DayOfWeek":3,"Time":16}]'),
   ('[{"DayOfWeek":0,"Time":6},{"DayOfWeek":1,"Time":6}]')

我尝试了JSON_Modify,但没有效果。主要是因为要更改的JSON数据是数组内的关键元素,这更难解决。
这看起来很接近,可以做一些修改:Update JSON using JSON_MODIFY

wwtsj6pe

wwtsj6pe1#

请尝试以下解决方案。
因为JSON值是一个普通的NVARCHAR(...)数据类型,所以一个常规的REPLACE()函数调用就可以完成这项工作。

    • SQL语言**
DECLARE @tbl TABLE (ID int IDENTITY PRIMARY KEY, JsonData NVARCHAR(MAX));
INSERT INTO @tbl (JsonData) VALUES 
(N'[{"Day":1,"Time":6},{"Day":2,"Time":11},{"Day":3,"Time":16}]'),
(N'[{"DayOfWeek":0,"Time":6},{"DayOfWeek":1,"Time":6}]');

UPDATE @tbl
SET JsonData = REPLACE(JsonData, '"Day"', '"DayOfWeek"');

-- test
SELECT * FROM @tbl;
    • 产出**

| 识别号|JSON数据|
| - ------| - ------|
| 1个|[{"星期几":1,"时间":6},{"星期几":2,"时间":11},{"星期几":3,"时间":16}]|
| 第二章|[{"星期几":0,"时间":6},{"星期几":1,"时间":6}]|

相关问题