微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将列中的嵌套JSON解析为SQL Server中的表

如何解决将列中的嵌套JSON解析为SQL Server中的表

我有一个只有一列的表,并且记录采用json格式,如下所示:

enter image description here

每一行的示例是:

{
    "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)   
                
        )

但是我得到的结果如下图所示:

enter image description here

我真的需要帮助。

解决方法

您需要两次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

返回

enter image description here

,

OPENJSON的替代方法是使用JSON_VALUEJSON_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 举报,一经查实,本站将立刻删除。