如何在 json 对象内使用 JSON_QUERY 和空 json 数组?
How do you use JSON_QUERY with null json array inside of json object?
SELECT JSON_query([json], '$') from mytable
Returns 细化 [json] 字段的内容
SELECT JSON_query([json], '$.Guid') from mytable
Returns null
SELECT JSON_query([json], '$.Guid[1]') from mytable
Returns 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')
他们都是returnnull
所以我一直想弄清楚如何创建获取信息的路径。也许 SQL 服务器 json_query
无法将 null 作为第一个数组处理?
下面是存储在数据库 [json]
字段中的字符串。
[
null,
{
"Round": 1,
"Guid": "15f4fe9d-403c-4820-8e35-8a8c8d78c33b",
"Team": "2",
"PlayerNumber": "78"
},
{
"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"
}
]
您需要关注问题下方的评论。我只是总结一下:
- 在您的情况下,最合适的方法可能是使用具有显式模式(
WITH
子句)的 OPENJSON()
。
JSON_QUERY()
从 JSON 字符串和 returns NULL
中提取 JSON 对象或 JSON 数组。如果 path
指向一个标量 JSON 值,函数 returns NULL
在 lax
模式下,在 strict
模式下出错。存储的 JSON 没有 $.Guid
键,因此 NULL
是 SELECT JSON_query([json], '$.Guid') FROM mytable
语句的实际结果。
以下陈述为您的问题提供了可行的解决方案:
Table:
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
SELECT JSON_query([json], '$') from mytable
Returns 细化 [json] 字段的内容
SELECT JSON_query([json], '$.Guid') from mytable
Returns null
SELECT JSON_query([json], '$.Guid[1]') from mytable
Returns 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')
他们都是returnnull
所以我一直想弄清楚如何创建获取信息的路径。也许 SQL 服务器 json_query
无法将 null 作为第一个数组处理?
下面是存储在数据库 [json]
字段中的字符串。
[ null, { "Round": 1, "Guid": "15f4fe9d-403c-4820-8e35-8a8c8d78c33b", "Team": "2", "PlayerNumber": "78" }, { "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" } ]
您需要关注问题下方的评论。我只是总结一下:
- 在您的情况下,最合适的方法可能是使用具有显式模式(
WITH
子句)的OPENJSON()
。 JSON_QUERY()
从 JSON 字符串和 returnsNULL
中提取 JSON 对象或 JSON 数组。如果path
指向一个标量 JSON 值,函数 returnsNULL
在lax
模式下,在strict
模式下出错。存储的 JSON 没有$.Guid
键,因此NULL
是SELECT JSON_query([json], '$.Guid') FROM mytable
语句的实际结果。
以下陈述为您的问题提供了可行的解决方案:
Table:
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