【问题标题】:Moving JSON Up in the hierarchy在层次结构中向上移动 JSON
【发布时间】:2017-05-31 16:15:22
【问题描述】:

我们有一个表 (MS SQL Azure),其中包含一些基本细节,如下所示:

CREATE TABLE [dbo].[Person]
(
    id [uniqueidentifier] NOT NULL,
    [firstname] [varchar](50) NULL,
    [lastname] [varchar](50) NOT NULL,
    [personInfo] [nvarchar](max) NOT NULL,
    [createdOn] [datetime] NOT NULL,
    [lastUpdateOn] [datetime] NOT NULL,     
)

PersonInfo 字段包含有关此人的所有其他详细信息的 JSON 值,如下所示:

{
   "personInfo":{
      "gender":"string",
      "address":{
         "streetAddress":"string",
         "city":"string",
         "district":"string",
         "stateProvince":"string",
         "postalCode":"string",
         "country":"string"
      },
      "emailAddress":"string",
      "addlEmails":[
         {
            "type":"string",
            "address":"string"
         }
      ],
      "businessPhone":"string",
      "mobilePhone":"string",
      "addlPhones":[
         {
            "type":"string",
            "number":"string",
            "prefix":"string",
            "suffix":"string"
         }
      ]
   }
}

我需要从 SQL 中以 JSON 格式获取数据,其中人员信息属性在级别中向上移动。如下:

{
   "id":"string",
   "firstname":"string",
   "lastname":"string",
   "id":"string",
   "gender":"string",
   "address":{
      "streetAddress":"string",
      "city":"string",
      "district":"string",
      "stateProvince":"string",
      "postalCode":"string",
      "country":"string"
   },
   "emailAddress":"string",
   "addlEmails":[
      {
         "type":"string",
         "address":"string"
      }
   ],
   "businessPhone":"string",
   "mobilePhone":"string",
   "addlPhones":[
      {
         "type":"string",
         "number":"string",
         "prefix":"string",
         "suffix":"string"
      }
   ]
}

有没有我可以做到这一点?

【问题讨论】:

    标签: sql sql-server json azure-sql-database


    【解决方案1】:

    没有可以“合并”列和 JSON 或合并两个 JSON 的 JSON 函数,因此没有很好且有效的方法来做到这一点。我建议尝试更改外部接口以使用嵌套格式。

    如果这不可能,这里有一些不太好的解决方法。

    此查询解析 personInfo JSON 返回中的某些部分,然后与标准列处于同一级别,并将它们与 for json 一起格式化:

    select id, firstname, lastname, gender, address, emailAddress, addlEmails
    from Person
    cross apply openjson(personInfo,'$.personInfo')
                with (  gender nvarchar(10),
                        address nvarchar(max) as json,
                        emailAddress nvarchar(20),
                        addlEmails nvarchar(max) as json) info
    for json path
    

    这种方法创建两个 JSON 对象并将它们连接起来,然后用逗号替换 }{ 以将它们合并:

    select 
        REPLACE((select id, firstname, lastname for json path, without_array_wrapper)  + json_query(personInfo,'$.personInfo'), '}{',',')
    from Person
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2015-12-10
      • 1970-01-01
      相关资源
      最近更新 更多