1

我将 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 并修改它?

4

1 回答 1

3

例子:

JSON是一个JSON对象数组,所以你需要一个索引来访问每个元素。在这种情况下,一种可能的方法是使用表达式作为path 参数JSON_MODIFY请注意,此功能在 SQL Server 2017 (14.x) 和 Azure SQL 数据库中可用。使用具有默认模式的OPENJSONJSON数组拆分为元素,在这种情况下,返回的列是,和。keyvaluetype

基本示例:

陈述:

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

笔记:

key列具有 BIN2 排序规则,因此您需要使用 collat​​e 选项进行转换。

于 2019-07-19T11:56:49.320 回答