2017-08-09 26 views
0

我通過Clearbit提供程序通過API調用將一些數據拉入本地服務器上的數據庫。關於使用SQL Server 2017解析數據的一切都是確定的,直到我遇到困難。解析SQL Server 2017中的JSON(Clearbit API調用)

我會直接進行示例以便於理解。

這是一個API調用輸出的JSON的例子

{ 
    "id": "384dfe0d-5bba-445e-a390-2d946dc84a12", 
    "name": "Honeywell", 
    "legalName": "Honeywell International Inc", 
    "domain": "honeywell.com", 
    "domainAliases": [ 
    "honeywell.at", 
    "honeywell.it", 
    "evohome.info", 
    "wifithermostat.com", 
    "emsaviation.com", 
    "mytotalconnect.com", 
    "honeywell.nl", 
    "honeywell.co.za", 
    "honeywell.com.au", 
    "honeywell.ca", 
    "alliedsignal.com", 
    "emsdss.com", 
    "primusepic.com", 
    "alarmnet-me.com", 
    "lebow.com", 
    "honeywell.ie", 
    "honeywell.jp", 
    "honeywell.com.br", 
    "trendcontrol.co.uk", 
    "honeywellforjaguar.co.uk", 
    "aviaso.com", 
    "skyforce.co.uk", 
    "newenglandinstruments.com", 
    "honeywell.fi", 
    "alarmnet.com", 
    "skyconnect.com", 
    "skyforceuk.com", 
    "securitex.com", 
    "missionready.com", 
    "honeywellaerospace.com", 
    "formation.com", 
    "aclon.com", 
    "electrocorp.com", 
    "ultrak.com", 
    "satcom1.com", 
    "hsmpats.com", 
    "myaerospace.com", 
    "emsglobaltracking.com", 
    "fascocontrols.com", 
    "honeywellnow.com", 
    "bendixbrakes.com", 
    "elmwoodsensors.com", 
    "ovationselect.com", 
    "honeywellbusinessaviation.com", 
    "iflyaspire.com", 
    "btrinc.com", 
    "honeywellspecialtymaterials.com", 
    "magneticsensors.com", 
    "activeye.com", 
    "egarrett.com", 
    "novar-eds.com", 
    "aviaso.co.uk", 
    "chadwick-helmuth.com", 
    "datainstruments.com", 
    "lebowproducts.com", 
    "honeywell-produktkatalog.de", 
    "honeywellforjaguar.com", 
    "hobbs-corp.com", 
    "emsgt.com", 
    "honeywellaes.com", 
    "honeywellbuildingsolutions.com", 
    "satcom1.aero", 
    "honeywell-building-solutions.de", 
    "lifesafetydistribution.com", 
    "godirect.com", 
    "garrettbulletin.com", 
    "yourhomeexpert.com", 
    "aerospacetrading.com", 
    "sensorsystems.com", 
    "wifithermostat.info", 
    "honeywell-fachseminare.de", 
    "hobbscorporation.com", 
    "kcl.hu", 
    "honeywell.sk", 
    "esser.info", 
    "inertialsensor.com", 
    "sensotec.com", 
    "notifier.com", 
    "honeywellgreer.com", 
    "smartact.de", 
    "honeywellfire.com", 
    "iris-systems.com", 
    "honeywell.ru", 
    "lxei.com", 
    "thermalswitch.com", 
    "hightempsolutions.com", 
    "aubetech.com", 
    "honeywell-haustechnik.de", 
    "careersathoneywell.com", 
    "garrettbyhoneywell.com", 
    "honeywell.in", 
    "honeywell.cn", 
    "honeywell.com.mx", 
    "kcp.com", 
    "satamatics.com", 
    "myflite.com" 
    ], 
    "site": { 
    "title": "Honeywell", 
    "h1": null, 
    "metaDescription": " We are blending products with software solutions to link people and businesses to the information they need to be more efficient, safer and connected. ", 
    "metaAuthor": null, 
    "phoneNumbers": [ 
     "+1 877-271-8620", 
     "+1 800-633-3991", 
     "+1 877-841-2840", 
     "+1 480-353-3020", 
     "+1 973-455-3388", 
     "+1 973-204-9621", 
     "+32 2 728 20 45", 
     "+32 476 20 90 19", 
     "+44 7794 007289", 
     "+86 21 2219 6509" 
    ], 
    "emailAddresses": [ 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]", 
     "[email protected]" 
    ] 
    }, 
    "category": { 
    "sector": "Consumer Discretionary", 
    "industryGroup": "Automobiles & Components", 
    "industry": "Automotive", 
    "subIndustry": "Automotive", 
    "sicCode": "3714", 
    "naicsCode": null 
    }, 
    "tags": [ 
    "Automotive", 
    "Enterprise", 
    "B2B", 
    "Electrical" 
    ], 
    "description": " We are blending products with software solutions to link people and businesses to the information they need to be more efficient, safer and connected. ", 
    "foundedYear": 1936, 
    "location": "115 Tabor Rd, Morris Plains, NJ 07950, USA", 
    "timeZone": "America/New_York", 
    "utcOffset": -4, 
    "geo": { 
    "streetNumber": "115", 
    "streetName": "Tabor Road", 
    "subPremise": null, 
    "city": "Morris Plains", 
    "postalCode": "07950", 
    "state": "New Jersey", 
    "stateCode": "NJ", 
    "country": "United States", 
    "countryCode": "US", 
    "lat": 40.8358456, 
    "lng": -74.4771042 
    }, 
    "logo": "https://logo.clearbit.com/honeywell.com", 
    "facebook": { 
    "handle": "293855263965203", 
    "likes": null 
    }, 
    "linkedin": { 
    "handle": "company/honeywell" 
    }, 
    "twitter": { 
    "handle": "HoneywellNow", 
    "id": "257492733", 
    "bio": "Please visit us over at @Honeywell.", 
    "followers": 2322, 
    "following": 1, 
    "location": "Morris Plains, NJ", 
    "site": "https:", 
    "avatar": 
    }, 
    "crunchbase": { 
    "handle": "organization/honeywell" 
    }, 
    "emailProvider": false, 
    "type": "public", 
    "ticker": "HON", 
    "phone": "+1 973-455-2000", 
    "metrics": { 
    "alexaUsRank": 6045, 
    "alexaGlobalRank": 18053, 
    "googleRank": null, 
    "employees": 51779, 
    "employeesRange": "1000+", 
    "marketCap": 102920000000, 
    "raised": null, 
    "annualRevenue": 39302000000, 
    "fiscalYearEnd": 12 
    }, 
    "indexedAt": "2017-07-11T23:00:41.115Z", 
    "tech": [ 
    "crazy_egg", 
    "google_analytics", 
    "google_tag_manager", 
    "asp_net", 
    "mouseflow", 
    "marketo", 
    "go_squared", 
    "microsoft_exchange_online", 
    "outlook", 
    "recaptcha" 
    ], 
    "parent": { 
    "domain": null 
    }, 
    "similarDomains": [ 
    "abb-livingspace.com", 
    "alerton.com", 
    "gereports.com", 
    "honeywellprocess.com", 
    "honeywelluk.com", 
    "johnsoncontrols.com", 
    "jpinstruments.com", 
    "lenel.com", 
    "maxitrol.com", 
    "nucalgon.com", 
    "schneider-electric.us", 
    "siemens.com" 
    ] 
} 

如果你看一下例子在這裏你會看到"domainAliases": [...] 那就是JSON的一部分,我仍然需要解析。

這是SQL解析查詢我已經有了:

SELECT * 
    , JSON_VALUE(JSONData,'$.name') AS CompanyName 
    , JSON_VALUE(JSONData,'$.category.sector') AS CategorySector 
    , JSON_VALUE(JSONData, '$.category.industryGroup') AS CategoryIndustryGroup 
    , JSON_VALUE(JSONData, '$.category.industry') AS CategoryIndustry 
    , JSON_VALUE(JSONData, '$.category.subIndustry') AS CategorySubIndustry 
    , JSON_VALUE(JSONData, '$.category.sicCode') AS CategorySicCode 
    , JSON_VALUE(JSONData, '$.category.naicsCode') AS CategoryNaicsCode 
    , JSON_VALUE(JSONData, '$.metrics.employees') AS EmployeesNumber 
    , JSON_VALUE(JSONData, '$.metrics.employeesRange') AS EmployeesRange 
    , JSON_VALUE(JSONData, '$.metrics.marketCap') AS MarketCap 
    , JSON_VALUE(JSONData, '$.metrics.annualRevenue') AS AnnualRevenue 
    , JSON_VALUE(JSONData, '$.similarDomains') AS SimilarDomains 
FROM Domains; 

我想這個數據(「domainAliases」)被存儲在其他表作爲在上查詢的數據(我知道我已經擁有的解析查詢只有一個SELECT查詢,但我也有查詢的UPDATE版本)。

下面是一張新表中相同數據庫應該看起來如何完成產品的示例圖。左邊一欄叫做Company Name,第2列被稱爲Domain Aliases

The left column is called Company Name, the 2nd column is called Domain Aliases.

現在WHEREJSON數據存儲在哪裏?我將它存儲在一個名爲JSONData的列中,表名爲:Domains,所有這些都存儲在名爲Domainbank的數據庫中。 JSONData數據類型爲nvarchar(max)

我需要將數據按公司名稱分組,並且在公司名稱旁邊應該有別名域,就像圖片示例所示。現在請記住,我將運行此查詢10k + JSONData s,即將創建的新表將會超級巨大,但只要它們都按公司名稱分組,並且所有別名域都應該是好的。某些JSONData s沒有以正確的格式返回API調用,因爲它們要麼沒有找到數據,要麼發生其他錯誤,所以如果查詢沒有找到"domainAliases": [...]下的任何東西,或者它甚至沒有找到"domainAliases": [...]那麼我不需要公司出現在新桌子上。

如此短暫回顧一下:讓我們做一個新表(我們稱之爲AliasDomains),發現"domainAliases": [...]下的數據也拉動了公司的名字在JSON_VALUE(JSONData,'$.name') AS CompanyName,存儲在新表中的數據作爲畫面例如在後高再由CompanyName組。

回答

1

所以,從你的帖子我不完全清楚你的問題是什麼,但我認爲這是如何寫一些SQL語句來完成上述?

首先,我會說你不應該在插入,做GROUP BY當從表中檢索數據。

說了這麼多,你可以很容易地從Domains表完成你想要的一個SELECT連同CROSS APPLY OPENJSON聲明,就像這樣:

INSERT INTO AliasDomains(CompanyName, DomainAliases) 
SELECT JSON_VALUE(JSONData, '$.name'), value 
FROM Domains 
CROSS APPLY OPENJSON (JSONData, '$.domainAliases') 

編輯:也許應該補充一點value在上面語句從OPENJSON返回,例如它引用您想要的路徑(在此例中爲domainAliases)的值。

希望這有助於?

Niels

+0

感謝您的回答,它工作得很好:) – Vissow