如何将复杂的 JSON 字符串放入 SQL Server 列中

问题描述

我已经将一些数据作为 JSON 字符串存储在表中,如下所示。

[
   {
      "firstName":"John","lastName":"Smith","age":25,"Address":{
         "streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021"
      },"PhoneNumbers":{
         "home":"212 555-1234","fax":"646 555-4567"
      }
   },{
      "firstName":"Mike","lastName":"Lee","age":30,"Address":{
         "streetAddress":"10 Street","PhoneNumbers":{
         "home":"212 555-3265","fax":""
      }
   }
]

要将这些数据导出到 excel 文件,我需要进行查询获取如下详细信息

enter image description here

使用 CROSS APPLY OPEnjsON 我可以获得姓名和年龄,但如何将地址和联系方式作为列获取

解决方法

您需要使用 OPENJSON() 和相应的 path

JSON:

DECLARE @json nvarchar(max) = N'[
   {
      "firstName":"John","lastName":"Smith","age":25,"Address":{
         "streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021"
      },"PhoneNumbers":{
         "home":"212 555-1234","fax":"646 555-4567"
      }
   },{
      "firstName":"Mike","lastName":"Lee","age":30,"Address":{
         "streetAddress":"10 Street","PhoneNumbers":{
         "home":"212 555-3265","fax":""
      }
   }
]'

声明:

SELECT *
FROM OPENJSON(@json) WITH (
   FirstName nvarchar(100) '$.firstName',LastName nvarchar(100) '$.lastName',Age int '$.age',Name nvarchar(100) '$.firstName',StreetAddress nvarchar(100) '$.Address.streetAddress',City nvarchar(100) '$.Address.city',State nvarchar(100) '$.Address.state',PostalCode nvarchar(100) '$.Address.postalCode',HomePhone nvarchar(100) '$.PhoneNumbers.home',Fax nvarchar(100) '$.PhoneNumbers.fax'
)

结果:

FirstName LastName Age Name StreetAddress City     State PostalCode HomePhone    Fax
John      Smith     25 John 21 2nd Street New York NY    10021      212 555-1234 646 555-4567
Mike      Lee       30 Mike 10 Street     New York NY    10021      212 555-3265