与 JSON 数组交叉应用

use*_*660 3 sql t-sql sql-server arrays json

我的表存储的数据格式如下 -

在此输入图像描述

现在,我想编写一个 SQL 查询来以下面的格式表示这些数据 -

在此输入图像描述

注意:Product 列中存储的数据是 JSON 数组。

Zho*_*rov 18

您需要两个额外的APPLY操作员来进行两个不同的OPENJSON()呼叫。第一次调用使用默认模式,结果是一个包含列keyvalue和 的表type。第二次调用使用具有适当列的显式模式,使用以下WITH子句定义:

桌子:

桌子:

CREATE TABLE Data (
   CustomerID int,
   City nvarchar(50),
   Product nvarchar(max)
)
INSERT INTO Data
   (CustomerID, City, Product)
VALUES
   (1, N'Delhi', N'[{"Products": [{"Id": "1", "Name": "TV"}, {"Id": "2", "Name": "Laptop"}]}]'),
   (2, N'Bamgalore', N'[{"Products": [{"Id": "1", "Name": "TV"}, {"Id": "2", "Name": "Laptop"}, {"Id": "3", "Name": "Mobile"}]}]')
Run Code Online (Sandbox Code Playgroud)

陈述:

SELECT d.CustomerID, j2.Id, j2.Name
FROM Data d
CROSS APPLY OPENJSON(d.Product, '$') j1
CROSS APPLY OPENJSON(j1.[value], '$.Products') WITH (
   Id nvarchar(10) '$.Id',
   Name nvarchar(50) '$.Name'
) j2
Run Code Online (Sandbox Code Playgroud)

结果:

----------------------
CustomerID  Id  Name
----------------------
1           1   TV
1           2   Laptop
2           1   TV
2           2   Laptop
2           3   Mobile
Run Code Online (Sandbox Code Playgroud)