【问题标题】:Parsing JSON in SQL Server 2017 (Clearbit API call)在 SQL Server 2017 中解析 JSON(Clearbit API 调用)
【发布时间】:2017-08-09 15:25:40
【问题描述】:

我通过 Clearbit 提供程序使用 API 调用将一些数据提取到本地服务器上的数据库中。关于使用 SQL Server 2017 解析数据一切正常,直到遇到问题。

为了便于理解,我将直接上示例。

这是 JSON 格式的 API 调用输出示例

{
  "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": [
      "domains@honeywell.com",
      "HoneywellPrivacy@honeywell.com",
      "rob.ferris@honeywell.com",
      "ilse.schouteden@honeywell.com",
      "chris.martin2@honeywell.com",
      "Anahi.Espinosa@honeywell.com",
      "lydia.lu@honeywell.com",
      "madhavi.jha@Honeywell.com",
      "Steven.Brecken@Honeywell.com",
      "Steve.Brecken@Honeywell.com",
      "Eugene.Tan@Honeywell.com"
    ]
  },
  "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,第二列叫Domain Aliases:

现在JSON 数据存储在何处?我将它存储在一个名为JSONData 的列中,表名:Domains,所有这些都存储在一个名为Domainbank 的数据库中。 JSONData 数据类型为 nvarchar(max)。

我需要按公司名称对数据进行分组,并且在公司名称旁边应该有别名域,就像图片示例所示。现在请记住,我将为 10k+ JSONDatas 运行此查询,并且要创建的新表将非常巨大,但只要它全部按公司名称和所有别名域分组,它就应该是好的。一些JSONDatas 没有以正确的格式返回 API 调用,因为他们要么没有找到数据,要么出现了其他问题,所以如果查询在 "domainAliases": [...] 下没有找到任何内容,或者没有甚至找到"domainAliases": [...] 然后我不需要公司出现在新表上。

简单回顾一下:让我们新建一个表(我们称之为AliasDomains),找到"domainAliases": [...]下的数据,同时将公司名称拉出JSON_VALUE(JSONData,'$.name') AS CompanyName,将数据存储在新表中,如上图示例在帖子中,然后按CompanyName分组。

【问题讨论】:

    标签: json api parsing sql-server-2017


    【解决方案1】:

    所以,从您的帖子中,我并不完全清楚您的问题是什么,但我认为是如何编写一些 SQL 语句来完成上述操作?

    首先,我想说你不应该关心插入中的GROUP BY,在从表中检索数据时执行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)路径的值。

    希望这有帮助吗?!

    尼尔斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多