以下是给定的JSON数据:

DECLARE @Jdata NVARCHAR(MAX) = 
'{
  "EmployeeDetails": {
    "BusinessEntityID": 3,
    "NationalIDNumber": 509647174,
    "JobTitle": "Engineering Manager",
    "BirthDate": "1974-11-12",
    "MaritalStatus": "M",
    "Gender": "M",
    "StoreDetail": {
      "Store": [
        {
          "AnnualSales": 800000,
          "AnnualRevenue": 80000,
          "BankName": "Guardian Bank",
          "BusinessType": "BM",
          "YearOpened": 1987,
          "Specialty": "Touring",
          "SquareFeet": 21000
        },
        {
          "AnnualSales": 300000,
          "AnnualRevenue": 30000,
          "BankName": "International Bank",
          "BusinessType": "BM",
          "YearOpened": 1982,
          "Specialty": "Road",
          "SquareFeet": 9000
        }
      ]
    }
  }
}';

需要显示:

BusinessEntityID |  AnnualSales  |  BusinessType 
-------------------------------------------------
3                   300000          BM
3                   800000          BM

我的try 是:

select *
from OPENJSON(@jdata)
WITH( 
BusinessEntityID VARCHAR(20) '$.EmployeeDetails.BusinessEntityID',
AnnualSales integer '$.EmployeeDetails.StoreDetail.Store.AnnualSales',
BusinessType VARCHAR(100) '$.EmployeeDetails.StoreDetail.Store.BusinessType'
) as a

但得到的是错误的输出.

BusinessEntityID |  AnnualSales  |  BusinessType 
-------------------------------------------------
3                   NULL            NULL

推荐答案

您需要额外的OPENJSON()调用和APPLY操作符来解析嵌套的JSON内容.在这种情况下,您需要在WITH子句中使用AS JSON修饰符来指定引用的属性($.EmployeeDetails.StoreDetail.Store)包含一个内部JSONarray.

SELECT j1.BusinessEntityID, j2.AnnualSales, j2.BusinessType
FROM OPENJSON(@jdata) WITH ( 
   BusinessEntityID VARCHAR(20) '$.EmployeeDetails.BusinessEntityID',
   Store NVARCHAR(max) '$.EmployeeDetails.StoreDetail.Store' AS JSON
) j1
OUTER APPLY OPENJSON(j1.Store) WITH (
  AnnualSales integer '$.AnnualSales',
  BusinessType VARCHAR(100) '$.BusinessType'
) j2  

当然,JSON_VALUE()和一个OPENJSON()呼叫的组合也是一种 Select :

SELECT 
  JSON_VALUE(@jdata, '$.EmployeeDetails.BusinessEntityID') AS BusinessEntityID, 
  AnnualSales,
  BusinessType
FROM OPENJSON(@jdata, '$.EmployeeDetails.StoreDetail.Store') WITH (
  AnnualSales integer '$.AnnualSales',
  BusinessType VARCHAR(100) '$.BusinessType'
) j

Sql相关问答推荐

如何并行SELECT和RESET?

基于列对多行求和的查询

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

SQL查询:合并2个表

提高写密集型表的查询性能

如何根据计数和分组获取订单总数

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

重用传递给 node 的参数-postgres upsert查询

SQL按日期分组字段和如果日期匹配则求和

数据库SQL PARSE_SYNTAX_ERROR

Postgres SQL查询从字符串中获取邮箱地址

从选定记录中提取摘要作为值的划分

计算组内多个日期间隔go 年的累计天数

SQL ORACLE - 查找连续天数

SQL 多个不满足的条件失败

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

获取 SQL Server 中每一行的两个-之间的文本

添加一列并根据其他列值进行填充

如何在 RavenDB Studio (RQL) 中插入更新文档

创建一个将层次 struct 级别放入列中的查询