0

JsonObjectt表中有一个列。我需要解析该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    

这只是显示提供者的第一条消息,但提供者有多个消息。如果我按以下方式查询,它没有提供任何“消息”数据

JSON_VALUE(JsonObject, '$.Messages.Sender') AS Sender,
JSON_VALUE(JsonObject, '$.Messages.Text') AS Text

消息数据如下:

{"Messages":[{"Sender":"John","Text":"xxxx"},{"Sender":"Peter","Text":"yyyy"}]}

如何在不同的行中显示每个“消息”数据以及“Id”和“Provider”?

4

1 回答 1

0

您需要使用CROSS APPLYOPENJSON。像这样:

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
于 2021-09-02T15:13:29.520 回答