将嵌套的 Json 数据解析为 SQL 服务器 table
Parse nested Json data into a SQL Server table
我在 t
table 中有一列 JsonObject
。我需要解析这个 JsonObject
列,它在数组中有 JSON 个值。
我的第一个解决方案是:
SELECT
JSON_VALUE(JsonObject, '$.Id') AS Id,
JSON_VALUE(JsonObject, '$.Provider') AS Provider,
JSON_VALUE(JsonObject, '$.Messages[0].Sender') AS Sender,
JSON_VALUE(JsonObject, '$.Messages[0].Text') AS Text
FROM
dbo.t
这只是提供者的第一条消息,但一个提供者有多个消息。如果我如下查询,它没有提供任何 'Messages' 数据
JSON_VALUE(JsonObject, '$.Messages.Sender') AS Sender,
JSON_VALUE(JsonObject, '$.Messages.Text') AS Text
消息数据如下:
{"Messages":[{"Sender":"John","Text":"xxxx"},{"Sender":"Peter","Text":"yyyy"}]}
如何在不同的行中显示每个 'Messages' 数据以及 'Id' 和 'Provider'?
您需要使用 CROSS APPLY and OPENJSON。像这样:
declare @msg table(id int identity, msg nvarchar(max))
insert into @msg(msg) values ('{"Messages":[{"Sender":"John","Text":"xxxx"},{"Sender":"Peter","Text":"yyyy"}]}')
insert into @msg(msg) values ('{"Messages":[{"Sender":"Fred","Text":"xxxx"},{"Sender":"Akex","Text":"yyyy"}]}')
select m.id, parsedJson.*
from @msg m
cross apply openjson(m.msg,'$.Messages')
with
(
Sender nvarchar(200),
Text nvarchar(max)
) as parsedJson
产出
id Sender Text
----------- ---------- -------------------
1 John xxxx
1 Peter yyyy
2 Fred xxxx
2 Akex yyyy
我在 t
table 中有一列 JsonObject
。我需要解析这个 JsonObject
列,它在数组中有 JSON 个值。
我的第一个解决方案是:
SELECT
JSON_VALUE(JsonObject, '$.Id') AS Id,
JSON_VALUE(JsonObject, '$.Provider') AS Provider,
JSON_VALUE(JsonObject, '$.Messages[0].Sender') AS Sender,
JSON_VALUE(JsonObject, '$.Messages[0].Text') AS Text
FROM
dbo.t
这只是提供者的第一条消息,但一个提供者有多个消息。如果我如下查询,它没有提供任何 'Messages' 数据
JSON_VALUE(JsonObject, '$.Messages.Sender') AS Sender,
JSON_VALUE(JsonObject, '$.Messages.Text') AS Text
消息数据如下:
{"Messages":[{"Sender":"John","Text":"xxxx"},{"Sender":"Peter","Text":"yyyy"}]}
如何在不同的行中显示每个 'Messages' 数据以及 'Id' 和 'Provider'?
您需要使用 CROSS APPLY and OPENJSON。像这样:
declare @msg table(id int identity, msg nvarchar(max))
insert into @msg(msg) values ('{"Messages":[{"Sender":"John","Text":"xxxx"},{"Sender":"Peter","Text":"yyyy"}]}')
insert into @msg(msg) values ('{"Messages":[{"Sender":"Fred","Text":"xxxx"},{"Sender":"Akex","Text":"yyyy"}]}')
select m.id, parsedJson.*
from @msg m
cross apply openjson(m.msg,'$.Messages')
with
(
Sender nvarchar(200),
Text nvarchar(max)
) as parsedJson
产出
id Sender Text
----------- ---------- -------------------
1 John xxxx
1 Peter yyyy
2 Fred xxxx
2 Akex yyyy