【问题标题】:How do you use JSON_QUERY with null json array inside of json object?如何在 json 对象内使用带有空 json 数组的 JSON_QUERY?
【发布时间】:2021-03-25 01:35:20
【问题描述】:
SELECT JSON_query([json], '$') from mytable

返回 [json] 字段的内容

SELECT JSON_query([json], '$.Guid') from mytable

返回null

SELECT JSON_query([json], '$.Guid[1]') from mytable

返回null

我现在也试过了:

SELECT JSON_query([json], '$[1].Guid') 
SELECT JSON_query([json], '$[2].Guid') 
SELECT JSON_query([json], '$[3].Guid') 
SELECT JSON_query([json], '$[4].Guid') 

他们都返回null

所以我一直想弄清楚如何创建获取信息的路径。也许 SQL Server json_query 无法将 null 作为第一个数组处理?

以下是存储在数据库中[json] 字段内的字符串。

[ 空值, { “第1轮, “指南”:“15f4fe9d-403c-4820-8e35-8a8c8d78c33b”, “团队”:“2”, “玩家编号”:“78” }, { “第1轮, “指南”:“8e91596b-cc33-4ce7-bfc0-ac3d1dc5eb67”, “团队”:“2”, “玩家编号”:“54” }, { “第1轮, “指南”:“f53cd74b-ed5f-47b3-aab5-2f3790f3cd34”, “团队”:“1”, “玩家编号”:“23” }, { “第1轮, “指南”:“30297678-f2cf-4b95-a789-a25947a4d4e6”, “团队”:“1”, “玩家编号”:“11” } ]

【问题讨论】:

  • 你忘了告诉我们你真正想要什么结果......
  • JSON_query([json], '$[1].Guid') 将 1 替换为您想要的任何数组索引(从零开始)。我怀疑你想要JSON_VALUE 而不是JSON_QUERY
  • @Charlieface 我刚刚尝试过,但 Guid 仍然为 NULL。
  • @sticky-bit 我正在尝试获取 Guid 值。
  • "JSON_value([json], '$[1].Guid') ... 返回 null" -- 不,does not

标签: json sql-server json-query


【解决方案1】:

您需要关注问题下方的 cmets。我只是总结一下:

  • 在您的情况下,最合适的方法可能是使用带有显式架构的 OPENJSON()WITH 子句)。
  • JSON_QUERY() 从 JSON 字符串中提取 JSON 对象或 JSON 数组并返回 NULL。如果path 指向一个标量JSON 值,则函数在lax 模式下返回NULL,在strict 模式下返回一个错误。存储的 JSON 没有 $.Guid 键,因此 NULLSELECT JSON_query([json], '$.Guid') FROM mytable 语句的实际结果。

以下陈述为您的问题提供了有效的解决方案:

表:

SELECT *
INTO Data
FROM (VALUES
   (N'[
  null,
  {
    "Round": 1,
    "Guid": "15f4fe9d-403c-4820-8e35-8a8c8d78c33b",
    "Team": "2",
    "PlayerNumber": "78",
    "TheProblem": "doesn''t"
  },
  {
    "Round": 1,
    "Guid": "8e91596b-cc33-4ce7-bfc0-ac3d1dc5eb67",
    "Team": "2",
    "PlayerNumber": "54"
      },
  {
    "Round": 1,
    "Guid": "f53cd74b-ed5f-47b3-aab5-2f3790f3cd34",
    "Team": "1",
    "PlayerNumber": "23"
    
  },
  {
    "Round": 1,
    "Guid": "30297678-f2cf-4b95-a789-a25947a4d4e6",
    "Team": "1",
    "PlayerNumber": "11"
     }
]')
) v (Json)

声明:

SELECT j.Guid
FROM Data d
OUTER APPLY OPENJSON(d.Json) WITH (
   Guid uniqueidentifier '$.Guid',
   Round int '$.Round',
   Team nvarchar(1) '$.Team',
   PlayerNumber nvarchar(2) '$.PlayerNumber'
) j

SELECT JSON_VALUE(j.[value], '$.Guid')
FROM Data d
OUTER APPLY OPENJSON(d.Json) j

结果:

Guid
------------------------------------

15f4fe9d-403c-4820-8e35-8a8c8d78c33b
8e91596b-cc33-4ce7-bfc0-ac3d1dc5eb67
f53cd74b-ed5f-47b3-aab5-2f3790f3cd34
30297678-f2cf-4b95-a789-a25947a4d4e6

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多