[英]Parse nested JSON in a column to Table in 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
嵌套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_VALUE
和JSON_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.