从表中选择 JSON_VALUE 返回 null 而不是值

Gib*_*Job 3 sql sql-server json json-value

JSON 存储在表中的“DataJson”列中

[{
    "KickOffDate": "1-Jan-2019",
    "TeamSize": "11",
    "ClientEngineer": "Sagar",
    "WaitingPeriod": "16.5"
}]
Run Code Online (Sandbox Code Playgroud)

询问

SELECT JSON_VALUE(DataJson,'$.KickOffDate') AS KickOffDate
     , JSON_VALUE(DataJson,'$.ClientEngineer') AS ClientEngineer
FROM [ABC].[Deliver]
Run Code Online (Sandbox Code Playgroud)

结果

KickOffDate   ClientEngineer
NULL          NULL
Run Code Online (Sandbox Code Playgroud)

结果应该是:

KickOffDate   ClientEngineer
1-Jan-2019    Sagar
Run Code Online (Sandbox Code Playgroud)

小智 8

你的sql查询是错误的。
您必须像下面这样更正查询。

 SELECT JSON_VALUE(DataJson,'$[0].KickOffDate') AS KickOffDate ,JSON_VALUE(DataJson,'$[0].ClientEngineer') AS ClientEngineer FROM [ABC].[Deliver]
Run Code Online (Sandbox Code Playgroud)

存储在表中的数据不是 JSON 对象,而是 JSON 数组。
所以为了获取JSON Object的每个值,需要在JSON Array中设置JSON Object的索引。
否则,您可以将数据存储为 JSON 对象,然后您的查询就可以正常工作了。


Tim*_*sen 2

您的 JSON 似乎格式错误,至少从 SQL Server 的 JSON API 的角度来看是这样。据我所知,如果您的 JSON 数据由顶级 JSON 数组组成,那么该数组需要有一个键名称,并且整个内容应该包含在{ ... }.

以下设置已经过测试并且有效:

WITH yourTable AS (
    SELECT '{ "data" : [{"KickOffDate": "1-Jan-2019", "TeamSize": "11", "ClientEngineer": "Sagar", "WaitingPeriod": "16.5"}] }' AS DataJson
)

SELECT
    JSON_VALUE(DataJson, '$.data[0].KickOffDate') AS KickOffDate,
    JSON_VALUE(DataJson, '$.data[0].ClientEngineer') AS ClientEngineer
FROM yourTable;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

演示

我使用的输入 JSON 如下所示:

{
    "data" : [
        {
            "KickOffDate": "1-Jan-2019",
            "TeamSize": "11",
            "ClientEngineer": "Sagar",
            "WaitingPeriod": "16.5"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)