2017-05-31 96 views
0

我们正处于一个表(MS SQL Azure的)与具有实体的基本细节,如下面几列:移动JSON最多的层次

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" 
     } 
    ] 
} 

有反正我可以做到这一点吗?

问候, 约翰

回答

2

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

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

该查询解析在同一水平的标准列personInfo JSON回报然后一些零件和与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