【问题标题】:SQL query to JSON data对 JSON 数据的 SQL 查询
【发布时间】:2020-03-20 16:17:09
【问题描述】:

我们在 MS SQL 数据库中有 JSON 条目。我想在“数据”列中导出与 EMPNO 列表匹配的 JSON 条目。有人可以帮忙吗?

列名:Data

列内数据:

output:{
   "Request":{
      "Person":{
         "DisplayName":"Test User",
         "EMPNO":"000001",
         "Entity":"01",
         "Country":"AA"
      },
      "DomainOverride":null,
      "ReasonForGen":"Only",
      "Email":"123@test.com",
      "CurrentSIP":"123@test.com"
   },
   "EmailAddress":"123@testcom",
   "SIPAddress":"123@test.com",
   "Status":"NoChange"
}

外行语言查询:

select DisplayName,EMPNO,Entity,Country,DomainOverride,ReasonForGen,Email
from Table1
where data.output.Request.EMPNO in ([EMPNO list])

【问题讨论】:

    标签: json sql-server


    【解决方案1】:

    您可以使用JSON_VALUE。像这样的:

    select JSON_VALUE(data,'$.Output.Request.Person.DisplayName'), ...
    from Table1
    where JSON_VALUE(data,'$.Output.Request.Person.EMPNO') in ([EMPNO list])
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用OPENJSON() 来解析 JSON 文本并从 JSON 输入中以表格形式获取对象和值。您需要在 WITH 子句中使用带有显式架构的 OPENJSON() 来定义列:

      表:

      CREATE TABLE Data (
         JsonData nvarchar(max)
      )
      INSERT INTO Data 
         (JsonData)
      VALUES
         (N'{
         "output":{
            "Request":{
               "Person":{
                  "DisplayName":"Test User",
                  "EMPNO":"000001",
                  "Entity":"01",
                  "Country":"AA"
               },
               "DomainOverride":null,
               "ReasonForGen":"Only",
               "Email":"123@test.com",
               "CurrentSIP":"123@test.com"
            },
            "EmailAddress":"123@testcom",
            "SIPAddress":"123@test.com",
            "Status":"NoChange"
         }
      }')
      

      声明:

      SELECT
         j.DisplayName,
         j.EMPNO,
         j.Entity,
         j.Country,
         j.DomainOverride,
         j.ReasonForGen,
         j.Email
      FROM Data d
      CROSS APPLY OPENJSON(d.JsonData) WITH (
         EMPNO nvarchar(10) '$.output.Request.Person.EMPNO',
         DisplayName nvarchar(50) '$.output.Request.Person.DisplayName',
         EMPNO nvarchar(50) '$.output.Request.Person.EMPNO',
         Entity nvarchar(50) '$.output.Request.Person.Entity',
         Country nvarchar(50) '$.output.Request.Person.Country',
         DomainOverride nvarchar(50) '$.output.Request.DomainOverride',
         ReasonForGen nvarchar(50) '$.output.Request.ReasonForGen',
         Email nvarchar(50) '$.output.Request.Email'
      ) j
      -- Use additional WHERE clause
      --WHERE j.EMPNO IN ('00001', '000002')
      

      结果:

      DisplayName EMPNO   Entity  Country DomainOverride  ReasonForGen    Email
      Test User   000001  01      AA                      Only            123@test.com
      

      【讨论】:

        猜你喜欢
        • 2019-11-29
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2023-02-20
        • 1970-01-01
        • 2018-10-04
        • 2020-08-04
        • 2019-04-29
        相关资源
        最近更新 更多