如何解决将列中的嵌套JSON解析为SQL Server中的表
每一行的示例是:
{
"id": "51cf9ff0-0ed5-11eb-8887-53248e3b2424","attributes": {
"source": "Google","medium": "cpc","visit_route": [
{
"time_on_page": 5,"page_title": "Dedicated Servers"
},{
"time_on_page": 1,"page_title": "Partner Programme"
}
],"keyword": null,"visit_length": 6,"started_at": "2020-10-15T10:56:31.51Z","ga_client_ids": [
"1213599109.1602733400"
],"lead_id": "597b4cd6-d8fb-11e6-adad-17d0cee77142_ayRRmwDGKhjjSgdcMGDMGf"
}
}
结果应如下所示:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|id |source |medium |visit_route |Keyword|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|51cf9ff0-0ed5-11eb-8887-53248e3b2424 |Google |cpc |[{"time_on_page": 5,"page_title": "Dedicated Servers"},{"time_on_page": 1,"page_title": "Partner Programme"}]| Null |
此示例在每行中。我是第一次使用sql解析json,并尝试使用以下脚本:
select id,attributes
from [StageDB].[dbo].[LeadFeeder_visits_json]
cross apply openjson(jsonObj)
WITH (
id nvarchar(100),attributes nvarchar(max)
)
但是我得到的结果如下图所示:
我真的需要帮助。
解决方法
您需要两次openjson()
:一次使jsonObj
嵌套,另一次访问嵌套的属性:
select x.id,y.source,y.medium,y.visit_route
from [StageDB].[dbo].[LeadFeeder_visits_json] l
cross apply openjson(l.jsonObj) with(
id nvarchar(100),attributes nvarchar(max) as json
) x
cross apply openjson(x.attributes) with (
source nvarchar(100),medium nvarchar(100),visit_route nvarchar(max) as json
) y
请注意,提取嵌套的json内容时需要as json
。
如果您有多组属性,则第二个cross apply
对应的GMB是正确的。如果只有一套,那么只需一个cross apply
就可以解决问题。
示例
Select B.*
From YourTable A
Cross Apply OpenJSON(jsonObj) WITH (
id varchar(100) '$.id',source varchar(100) '$.attributes.source',medium varchar(100) '$.attributes.medium',visit_route nvarchar(MAX) '$.attributes.visit_route' AS JSON,keyword varchar(100) '$.attributes.keyword'
) B
返回
, OPENJSON
的替代方法是使用JSON_VALUE
和JSON_QUERY
找出所需的途径。 JSON函数可以选择指定是否严格要求一个字段。例如,在代码中,第一个JSON_VALUE
指定JSON中“ id”严格存在的“ id”。如果不存在“ id”字段,则JSON_VALUE
函数将返回错误
表中的JSON
drop table if exists #json;
go
create table #json(
jsonObj nvarchar(max) not null);
go
insert #json(jsonObj) values (N'{
"id": "51cf9ff0-0ed5-11eb-8887-53248e3b2424","attributes": {
"source": "Google","medium": "cpc","visit_route": [
{
"time_on_page": 5,"page_title": "Dedicated Servers"
},{
"time_on_page": 1,"page_title": "Partner Programme"
}
],"keyword": null,"visit_length": 6,"started_at": "2020-10-15T10:56:31.51Z","ga_client_ids": [
"1213599109.1602733400"
],"lead_id": "597b4cd6-d8fb-11e6-adad-17d0cee77142_ayRRmwDGKhjjSgdcMGDMGf"
}
}');
查询
select json_value(jsonObj,N'strict $.id') id,json_value(jsonObj,N'$.attributes.source') [source],N'$.attributes.medium') [medium],json_query(jsonObj,N'$.attributes.visit_route') visit_route,N'$.attributes.keyword') keyword
from #json;
输出
id source medium visit_route keyword
51cf9ff0-0ed5-11eb-8887-53248e3b2424 Google cpc [{time_on_page": 5,"page_title": "Dedicated Servers" },{ "time_on_page": 1,"page_title": "Partner Programme" } ] NULL
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。