T-SQL:如何处理名称中带有点的 JSON 元素?

KDW*_*olf 2 t-sql json

我需要使用 T-SQL 处理 JSON 对象。我可以成功检索除具有“.”的元素之外的所有元素。(点)在其名称中,例如 System.State、System.UserName。请问有人可以建议如何解决吗?

    DECLARE @v_Json NVARCHAR(MAX) = N'{
    "count": 56,
    "value": [{
            "id": 1,
            "workItemId": 1234,
            "fields": {
                "MainValue": {"newValue": 98765},
                "System.UserName": "User Name 1",
                "System.Id": {
                    "newValue": 1234
                },
                "System.State": {
                    "newValue": "New"
                }
            }
        },
        {
            "id": 2,
            "workItemId": 1234,
            "fields": {
            "MainValue": {"newValue": 123456, "oldValue": 98765},
            "System.UserName": "User Name 2",
                "System.State": {
                    "oldValue": "new",
                    "newValue": "Defined"
                }
            }
        }
    ]
}';


--SELECT F.[System.State]
--FROM OPENJSON (@v_Json)
--     WITH ([count] int,
--           value nvarchar(MAX) AS JSON) J
--     CROSS APPLY OPENJSON(J.value)
--                 WITH ([System.State] NVARCHAR(50)) F;

SELECT  JSON_VALUE(v.value, '$.id') AS id,
        JSON_VALUE(v.value, '$.workItemId') AS workItemID,
        JSON_VALUE(v.value, '$.fields.MainValue.newValue') AS MainValue,
        JSON_VALUE(v.value, '$.fields.System.UserName') AS itemUserName,
        JSON_VALUE(v.value, '$.fields.System.State') AS itemState,
        JSON_VALUE(v.value, '$.fields.System.State.newValue') AS itemStateNewValue

FROM OPENJSON(@v_Json, '$.value') AS v
Run Code Online (Sandbox Code Playgroud)

编辑以添加结果屏幕,例如,我希望在 itemUserName 列中看到“用户名 1”。

在此输入图像描述

Shn*_*ugo 7

在 JSON 路径中使用引号就足够了:

    JSON_VALUE(v.value, '$.fields."System.UserName"') AS itemUserName,
Run Code Online (Sandbox Code Playgroud)

返回值:

DECLARE @v_Json NVARCHAR(MAX) = N'{
    "count": 56,
    "value": [{
            "id": 1,
            "workItemId": 1234,
            "fields": {
                "MainValue": {"newValue": 98765},
                "System.UserName": "User Name 1",
                "System.Id": {
                    "newValue": 1234
                },
                "System.State": {
                    "newValue": "New"
                }
            }
        },
        {
            "id": 2,
            "workItemId": 1234,
            "fields": {
            "MainValue": {"newValue": 123456, "oldValue": 98765},
            "System.UserName": "User Name 2",
                "System.State": {
                    "oldValue": "new",
                    "newValue": "Defined"
                }
            }
        }
    ]
}';
Run Code Online (Sandbox Code Playgroud)

-- 查询

SELECT  JSON_VALUE(v.value, '$.id') AS id,
        JSON_VALUE(v.value, '$.workItemId') AS workItemID,
        JSON_VALUE(v.value, '$.fields.MainValue.newValue') AS MainValue,
        JSON_VALUE(v.value, '$.fields."System.UserName"') AS itemUserName,
        JSON_VALUE(v.value, '$.fields."System.State".oldValue') AS itemState,
        JSON_VALUE(v.value, '$.fields."System.State".newValue') AS itemStateNewValue

FROM OPENJSON(@v_Json, '$.value') AS v;
Run Code Online (Sandbox Code Playgroud)