我将JSON数据存储在SQL Server中。
我的桌子如下:
表名称:JsonData
列:ID,数据
我的JSON看起来像:
{
"data": [{
"identifier": 1,
"someData": {
"sample1": "lorem 1",
"sample2": "test 1"
}
},
{
"identifier": 2,
"someData": {
"sample1": "lorem 2",
"sample2": "test 2"
}
},
{
"identifier": 3,
"someData": {
"sample1": "lorem 3",
"sample2": "test 3"
}
}
]
}
我想使用JSON_MODIFY更新例如sample1的标识符3。 如何访问sample1并对其进行修改?
答案 0 :(得分:1)
示例:
您的JSON
是JSON
对象的数组,因此您需要一个索引才能访问每个元素。在这种情况下,一种可能的方法是将表达式用作path
的{{1}} parameter。请注意,此功能在SQL Server 2017(14.x)和Azure SQL数据库中可用。 JSON_MODIFY
数组使用带有默认架构的OPENJSON拆分为元素,在这种情况下,返回的列为JSON
,key
和value
。
基本示例:
声明:
type
输出:
DECLARE @json nvarchar(max) = N'{
"data": [{
"identifier": 1,
"someData": {
"sample1": "lorem 1",
"sample2": "test 1"
}
},
{
"identifier": 2,
"someData": {
"sample1": "lorem 2",
"sample2": "test 2"
}
},
{
"identifier": 3,
"someData": {
"sample1": "lorem 3",
"sample2": "test 3"
}
}
]
}'
SELECT JSON_MODIFY(@json, '$.data[' + j.[key] + '].someData.sample1', N'NewValue') AS JsonData
FROM OPENJSON(@json, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
表格示例:
表格:
----------------------------
JsonData
----------------------------
{
"data": [{
"identifier": 1,
"someData": {
"sample1": "lorem 1",
"sample2": "test 1"
}
},
{
"identifier": 2,
"someData": {
"sample1": "lorem 2",
"sample2": "test 2"
}
},
{
"identifier": 3,
"someData": {
"sample1": "NewValue",
"sample2": "test 3"
}
}
]
}
声明:
CREATE TABLE #Data (
ID int,
Data nvarchar(max)
)
INSERT INTO #Data
(ID, Data)
VALUES
(1, N'{
"data": [{
"identifier": 1,
"someData": {
"sample1": "lorem 1",
"sample2": "test 1"
}
},
{
"identifier": 2,
"someData": {
"sample1": "lorem 2",
"sample2": "test 2"
}
},
{
"identifier": 3,
"someData": {
"sample1": "lorem 3",
"sample2": "test 3"
}
}
]
}'),
(2, N'{
"data": [{
"identifier": 1,
"someData": {
"sample1": "lorem 1",
"sample2": "test 1"
}
},
{
"identifier": 2,
"someData": {
"sample1": "lorem 2",
"sample2": "test 2"
}
},
{
"identifier": 3,
"someData": {
"sample1": "lorem 3",
"sample2": "test 3"
}
}
]
}')
注意:
SELECT
d.ID, c.Data
FROM #Data d
CROSS APPLY (
SELECT JSON_MODIFY(d.Data, N'$.data[' + CONVERT(nvarchar(max), j.[key] COLLATE Latin1_General_CI_AS) + N'].someData.sample1', N'NewValue') AS Data
FROM OPENJSON(d.Data, '$.data') j
WHERE JSON_VALUE([value], '$.identifier') = 3
) c
列具有BIN2排序规则,因此您需要使用collate选项进行转换。