Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Json_值和Json_查询找不到指定的路径_Sql_Json_Sql Server_Tsql - Fatal编程技术网

Sql Json_值和Json_查询找不到指定的路径

Sql Json_值和Json_查询找不到指定的路径,sql,json,sql-server,tsql,Sql,Json,Sql Server,Tsql,我正在尝试解析来自以下JSON的数据。我知道JSON_值和JSON_查询之间存在差异,但我只是试图获得正确的路径结构。我使用STRICT选项来验证我的路径,到目前为止,其他字符串$forJSON查询都会因为找不到路径而失败。我一添加.data.taskData,路径就好像爆炸了。任何帮助都将不胜感激 我将以下JSON设置为@JSON declare @json nvarchar(max) SELECT JSON_VALUE(@json, 'strict$.data.taskData.starte

我正在尝试解析来自以下JSON的数据。我知道JSON_值和JSON_查询之间存在差异,但我只是试图获得正确的路径结构。我使用STRICT选项来验证我的路径,到目前为止,其他字符串$forJSON查询都会因为找不到路径而失败。我一添加.data.taskData,路径就好像爆炸了。任何帮助都将不胜感激

我将以下JSON设置为@JSON

declare @json nvarchar(max)
SELECT JSON_VALUE(@json, 'strict$.data.taskData.startedLocation') as json 
select JSON_QUERY(@json, 'strict$.data.taskData.startedLocation')  as json
下面是我试图解析的JSON

{"data.taskData":{"startedAtUtc":"2019-08-28T20:21:29.025Z","startedLocation":{"lat":60.7348366,"lon":-124.9856841},"additionalData":[],"bols":[{"number":"1234","product":{"id":"COFFEE","description":"GROUND COFFE 5LB CAN","plannedQuantity":1352,"uom":"PCS","supplier":"WALMART ","accountOf":"","class":"UNKNOWN","loadedQuantity":6600,"netQuantity":9993},"net":"9993"}],"compartments":[{"id":"1","capacity":3400,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"1","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1000","bol":"1234"}],"loadedQuantity":1000,"productID":"COFFEE"},{"id":"2","capacity":2000,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"2","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2000","bol":"1234"}],"loadedQuantity":2000,"productID":"COFFEE"},{"id":"3","capacity":1100,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"3","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1100","bol":"1234"}],"loadedQuantity":1100,"productID":"COFFEE"},{"id":"4","capacity":2700,"commodity":null,"consignee":null,"plannedQuantity":0,"tankID":"4","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2500","bol":"1234"}],"loadedQuantity":2500,"productID":"COFFEE"}],"detention":{"minutes":null,"reasonCode":null,"notes":null},"initialCompartments":[{"id":"1","capacity":3400,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"1"},{"id":"2","capacity":2000,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"2"},{"id":"3","capacity":1100,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"3"},{"id":"4","capacity":2700,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"4"}],"loadingComplete":"yes","loadingCompleteTime":"2019-08-28T20:23:05.453Z","uom":{"key":"PCS","category":"volume","shortDisplay":"p","longDisplay":"Pieces","conversionFactors":{"gal":0.0625,"L":0.2365882365,"c":4.2267528377}},"variances":[],"completedAtUtc":"2019-08-28T20:23:06.703Z","completedLocation":{"lat":61.7348308,"lon":-124.9856879},"finalCompartments":[{"id":"1","capacity":3400,"productID":"COFFEE","loadedQuantity":1000,"consignee":"KSUAC","tankID":"1"},{"id":"2","capacity":2000,"productID":"COFFEE","loadedQuantity":2000,"consignee":"KSUAC","tankID":"2"},{"id":"3","capacity":1100,"productID":"COFFEE","loadedQuantity":1100,"consignee":"KSUAC","tankID":"3"},{"id":"4","capacity":2700,"productID":"COFFEE","loadedQuantity":2500,"consignee":null,"tankID":"4"}]}}
这项工作:

select JSON_QUERY(@json, 'strict$."data.taskData".startedLocation')  as json
SELECT JSON_VALUE(@json, 'strict$."data.taskData".startedLocation.lat') as json 

你需要考虑以下几点:

  • 当您要提取
    JSON
    对象或标量值,并且您的路径以美元符号
    $
    开头,或者在键中有特殊字符时,需要用引号将其括起来
  • 函数
    JSON\u QUERY
    JSON
    字符串中提取对象或数组。如果值不是对象或数组,则在
    lax
    模式下结果为
    NULL
    ,在
    strict
    模式下结果为错误
  • 函数
    JSON\u VALUE
    JSON
    字符串中提取标量值。如果
    路径
    未指向标量值,则结果在
    lax
    模式下为
    NULL
    ,在
    strict
    模式下为错误
  • 当您想要解析
    JSON
    字符串并将结果作为表获取时,请使用
    OPENJSON
    表值函数
使用示例数据,您可以尝试以下示例:

DECLARE @json nvarchar(max) = N'{"data.taskData":{"startedAtUtc":"2019-08-28T20:21:29.025Z","startedLocation":{"lat":60.7348366,"lon":-124.9856841},"additionalData":[],"bols":[{"number":"1234","product":{"id":"COFFEE","description":"GROUND COFFE 5LB CAN","plannedQuantity":1352,"uom":"PCS","supplier":"WALMART ","accountOf":"","class":"UNKNOWN","loadedQuantity":6600,"netQuantity":9993},"net":"9993"}],"compartments":[{"id":"1","capacity":3400,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"1","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1000","bol":"1234"}],"loadedQuantity":1000,"productID":"COFFEE"},{"id":"2","capacity":2000,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"2","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2000","bol":"1234"}],"loadedQuantity":2000,"productID":"COFFEE"},{"id":"3","capacity":1100,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"3","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1100","bol":"1234"}],"loadedQuantity":1100,"productID":"COFFEE"},{"id":"4","capacity":2700,"commodity":null,"consignee":null,"plannedQuantity":0,"tankID":"4","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2500","bol":"1234"}],"loadedQuantity":2500,"productID":"COFFEE"}],"detention":{"minutes":null,"reasonCode":null,"notes":null},"initialCompartments":[{"id":"1","capacity":3400,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"1"},{"id":"2","capacity":2000,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"2"},{"id":"3","capacity":1100,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"3"},{"id":"4","capacity":2700,"commodity":null,"consignee":null,"plannedQuantity":null,"tankID":"4"}],"loadingComplete":"yes","loadingCompleteTime":"2019-08-28T20:23:05.453Z","uom":{"key":"PCS","category":"volume","shortDisplay":"p","longDisplay":"Pieces","conversionFactors":{"gal":0.0625,"L":0.2365882365,"c":4.2267528377}},"variances":[],"completedAtUtc":"2019-08-28T20:23:06.703Z","completedLocation":{"lat":61.7348308,"lon":-124.9856879},"finalCompartments":[{"id":"1","capacity":3400,"productID":"COFFEE","loadedQuantity":1000,"consignee":"KSUAC","tankID":"1"},{"id":"2","capacity":2000,"productID":"COFFEE","loadedQuantity":2000,"consignee":"KSUAC","tankID":"2"},{"id":"3","capacity":1100,"productID":"COFFEE","loadedQuantity":1100,"consignee":"KSUAC","tankID":"3"},{"id":"4","capacity":2700,"productID":"COFFEE","loadedQuantity":2500,"consignee":null,"tankID":"4"}]}}'

SELECT 
   JSON_QUERY(@json, 'strict $."data.taskData".startedLocation') AS StartedLocation,
   JSON_VALUE(@json, 'strict $."data.taskData".startedLocation.lat') as Lat,
   JSON_VALUE(@json, 'strict $."data.taskData".startedLocation.lon') as Lon

SELECT *
FROM OPENJSON(@json, 'strict $."data.taskData".compartments') AS Compartments
输出:

----------------------------------------------------------------
StartedLocation                         Lat          Lon
----------------------------------------------------------------
{"lat":60.7348366,"lon":-124.9856841}   60.7348366  -124.9856841

----------------
key value   type
----------------
0   {"id":"1","capacity":3400,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"1","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1000","bol":"1234"}],"loadedQuantity":1000,"productID":"COFFEE"} 5
1   {"id":"2","capacity":2000,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"2","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2000","bol":"1234"}],"loadedQuantity":2000,"productID":"COFFEE"} 5
2   {"id":"3","capacity":1100,"commodity":null,"consignee":"KSUAC","plannedQuantity":0,"tankID":"3","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"1100","bol":"1234"}],"loadedQuantity":1100,"productID":"COFFEE"} 5
3   {"id":"4","capacity":2700,"commodity":null,"consignee":null,"plannedQuantity":0,"tankID":"4","additionalData":[],"allLoadsValid":true,"complete":true,"error":false,"locked":false,"loads":[{"isFirst":true,"quantity":"2500","bol":"1234"}],"loadedQuantity":2500,"productID":"COFFEE"}    5

试试这个。代码结束后,我将对特产进行评论:

DECLARE @json NVARCHAR(MAX)=N'{
    "data.taskData": {
        "startedAtUtc": "2019-08-28T20:21:29.025Z",
        "startedLocation": {
            "lat": 60.7348366,
            "lon": -124.9856841
        },
        "additionalData": [],
        "bols": [
            {
                "number": "1234",
                "product": {
                    "id": "COFFEE",
                    "description": "GROUND COFFE 5LB CAN",
                    "plannedQuantity": 1352,
                    "uom": "PCS",
                    "supplier": "WALMART ",
                    "accountOf": "",
                    "class": "UNKNOWN",
                    "loadedQuantity": 6600,
                    "netQuantity": 9993
                },
                "net": "9993"
            }
        ],
        "compartments": [
            {
                "id": "1",
                "capacity": 3400,
                "commodity": null,
                "consignee": "KSUAC",
                "plannedQuantity": 0,
                "tankID": "1",
                "additionalData": [],
                "allLoadsValid": true,
                "complete": true,
                "error": false,
                "locked": false,
                "loads": [
                    {
                        "isFirst": true,
                        "quantity": "1000",
                        "bol": "1234"
                    }
                ],
                "loadedQuantity": 1000,
                "productID": "COFFEE"
            },
            {
                "id": "2",
                "capacity": 2000,
                "commodity": null,
                "consignee": "KSUAC",
                "plannedQuantity": 0,
                "tankID": "2",
                "additionalData": [],
                "allLoadsValid": true,
                "complete": true,
                "error": false,
                "locked": false,
                "loads": [
                    {
                        "isFirst": true,
                        "quantity": "2000",
                        "bol": "1234"
                    }
                ],
                "loadedQuantity": 2000,
                "productID": "COFFEE"
            },
            {
                "id": "3",
                "capacity": 1100,
                "commodity": null,
                "consignee": "KSUAC",
                "plannedQuantity": 0,
                "tankID": "3",
                "additionalData": [],
                "allLoadsValid": true,
                "complete": true,
                "error": false,
                "locked": false,
                "loads": [
                    {
                        "isFirst": true,
                        "quantity": "1100",
                        "bol": "1234"
                    }
                ],
                "loadedQuantity": 1100,
                "productID": "COFFEE"
            },
            {
                "id": "4",
                "capacity": 2700,
                "commodity": null,
                "consignee": null,
                "plannedQuantity": 0,
                "tankID": "4",
                "additionalData": [],
                "allLoadsValid": true,
                "complete": true,
                "error": false,
                "locked": false,
                "loads": [
                    {
                        "isFirst": true,
                        "quantity": "2500",
                        "bol": "1234"
                    }
                ],
                "loadedQuantity": 2500,
                "productID": "COFFEE"
            }
        ],
        "detention": {
            "minutes": null,
            "reasonCode": null,
            "notes": null
        },
        "initialCompartments": [
            {
                "id": "1",
                "capacity": 3400,
                "commodity": null,
                "consignee": null,
                "plannedQuantity": null,
                "tankID": "1"
            },
            {
                "id": "2",
                "capacity": 2000,
                "commodity": null,
                "consignee": null,
                "plannedQuantity": null,
                "tankID": "2"
            },
            {
                "id": "3",
                "capacity": 1100,
                "commodity": null,
                "consignee": null,
                "plannedQuantity": null,
                "tankID": "3"
            },
            {
                "id": "4",
                "capacity": 2700,
                "commodity": null,
                "consignee": null,
                "plannedQuantity": null,
                "tankID": "4"
            }
        ],
        "loadingComplete": "yes",
        "loadingCompleteTime": "2019-08-28T20:23:05.453Z",
        "uom": {
            "key": "PCS",
            "category": "volume",
            "shortDisplay": "p",
            "longDisplay": "Pieces",
            "conversionFactors": {
                "gal": 0.0625,
                "L": 0.2365882365,
                "c": 4.2267528377
            }
        },
        "variances": [],
        "completedAtUtc": "2019-08-28T20:23:06.703Z",
        "completedLocation": {
            "lat": 61.7348308,
            "lon": -124.9856879
        },
        "finalCompartments": [
            {
                "id": "1",
                "capacity": 3400,
                "productID": "COFFEE",
                "loadedQuantity": 1000,
                "consignee": "KSUAC",
                "tankID": "1"
            },
            {
                "id": "2",
                "capacity": 2000,
                "productID": "COFFEE",
                "loadedQuantity": 2000,
                "consignee": "KSUAC",
                "tankID": "2"
            },
            {
                "id": "3",
                "capacity": 1100,
                "productID": "COFFEE",
                "loadedQuantity": 1100,
                "consignee": "KSUAC",
                "tankID": "3"
            },
            {
                "id": "4",
                "capacity": 2700,
                "productID": "COFFEE",
                "loadedQuantity": 2500,
                "consignee": null,
                "tankID": "4"
            }
        ]
    }
}';
--询问

SELECT FirstLevel.StartedAtUtc
      ,JSON_VALUE(FirstLevel.startedLocation,'$.lat') AS startedLocation_Lat
      ,JSON_VALUE(FirstLevel.startedLocation,'$.lon') AS startedLocation_Lon
      ,FirstLevel.additionalData
      ,FirstLevel.bols
      ,Sub_Compartments.id
      ,Sub_Compartments.capacity
      ,FirstLevel.loadingComplete
FROM OPENJSON(@json,'$."data.taskData"')
WITH(startedAtUtc DATETIME2
    ,startedLocation NVARCHAR(MAX) AS JSON
    ,additionalData NVARCHAR(MAX) AS JSON
    ,bols NVARCHAR(MAX) AS JSON
    --compartments seems to be a 1:n related node
    ,compartments NVARCHAR(MAX) AS JSON
    ,loadingComplete NVARCHAR(10)
    --and more
    ) FirstLevel
OUTER APPLY OPENJSON(FirstLevel.compartments)
WITH (id INT
     ,capacity INT
     --more columns
     ) Sub_Compartments;
简而言之:

您的JSON是一个完全成熟的深度嵌套结构,包含各种数据。总的来说,一切都会导致一张非常多余的平板桌子。最好用尽可能狭窄的问题来查询这个JSON

正如我们已经告诉您的,我们可以使用其中一种:

  • JSON_VALUE()从给定路径检索标量值。嵌套的JSON将作为字符串类型返回
  • JSON_QUERY()提取JSON片段并作为JSON继续
  • OPENJSON需要深入到包含重复元素的JSON中,以便将片段作为派生集逐行返回。非常重要的是WITH子句,它允许将OPENJSON的默认输出更改为并排的列(类似于PIVOT)
在本例中,我们可以使用OPENJSON深入到第一级并返回在那里找到的对象。其中一些是标量值,可以作为类型化值返回,另一些是JSON对象。在这种情况下,我们必须使用
NVARCHAR(MAX)
作为数据类型,并且必须指定为JSON才能继续返回值

在JSON中,分区是一个1:n相关集。我们可以使用OPENJSON调用的级联,使用第一个调用返回的片段作为输入,并使用另一个WITH子句来提取comparement的列

我希望,这个例子将给您足够的提示,您可以查询JSON的任何位置。祝你好运