簡體   English   中英

將列中的嵌套 JSON 解析為 SQL Server 中的表

[英]Parse nested JSON in a column to Table in SQL Server

我有一個只有一列的表,記錄采用 json 格式,如下所示: 在此處輸入圖片說明

每行的樣本為:

{
    "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嵌套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

如果您有多組 ATTRIBUTES,則 GMB 與第二個cross apply是正確的。 如果只有一組,那么您可以通過一個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的替代OPENJSON是使用JSON_VALUEJSON_QUERY來挑選所需的路徑。 JSON 函數可以選擇指定是否嚴格要求某個字段。 例如,在代碼中,第一個JSON_VALUE將“id”指定為“嚴格”存在於 JSON 中。 如果“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],
       json_value(jsonObj, N'$.attributes.medium') [medium],
       json_query(jsonObj, N'$.attributes.visit_route') visit_route,
       json_value(jsonObj, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM