sql-server - SQL Server:JSON - 按数组内数组中的值过滤
问题描述
我有一个包含复杂 json 列的表:
{
"Workflow":{
"Waypoints":[
{
"Name":"Test",
"Events":[
{
"Id":"1",
"OriginId":"1",
"Position":"TopLeft",
"ScanType":"Scan",
"ScanOrder":0
}
]
},
{
"Name":"Test2",
"Events":[
{
"Id":"2",
"OriginId":"2",
"Position":"TopLeft",
"ScanType":"UnitScan",
"ScanOrder":1
}
]
}
]
}
}
我需要EventId
按位置和 ScanOrder 接收。
我尝试了这样的解决方案,但它不起作用:
SELECT *
FROM OPENJSON('@json', '$.Workflow.Waypoints.Events')
WITH (Id NVARCHAR(32) '$.Id') A
但它没有返回任何记录。
解决方案
您可以像这样解析 JSON:
/* JSON data */
DECLARE @json nvarchar(MAX) = '{
"Workflow":{
"Waypoints":[
{
"Name":"Test",
"Events":[
{
"Id":"1",
"OriginId":"1",
"Position":"TopLeft",
"ScanType":"Scan",
"ScanOrder":0
}
]
},
{
"Name":"Test2",
"Events":[
{
"Id":"2",
"OriginId":"2",
"Position":"TopLeft",
"ScanType":"UnitScan",
"ScanOrder":1
}
]
}
]
}
}';
/* Parse JSON */
SELECT
[Name], Id, OriginId, Position, ScanType, ScanOrder
FROM OPENJSON ( @json, '$.Workflow.Waypoints' ) WITH (
[Name] varchar(50) '$.Name',
[Events] nvarchar(MAX) '$.Events' AS JSON
)
CROSS APPLY OPENJSON ( [Events] ) WITH (
Id int '$.Id',
OriginId int '$.OriginId',
Position varchar(50) '$.Position',
ScanType varchar(50) '$.ScanType',
ScanOrder int '$.ScanOrder'
);
退货
+-------+----+----------+----------+----------+-----------+
| Name | Id | OriginId | Position | ScanType | ScanOrder |
+-------+----+----------+----------+----------+-----------+
| Test | 1 | 1 | TopLeft | Scan | 0 |
| Test2 | 2 | 2 | TopLeft | UnitScan | 1 |
+-------+----+----------+----------+----------+-----------+
你可以添加一个你认为合适的WHERE
和。ORDER BY
推荐阅读
- javascript - 调用 redux-form 的 React 组件方法
- matlab - 计算图像中每种颜色(像素值)的出现次数
- reactjs - React-Router,gh-pages 的问题
- python - 如何实时动画画布
- javascript - 用javascript覆盖设计
- javascript - 使用 Ajax 和 php 将标签数据插入到数据库
- javascript - 使用页面上的 javascript 从 Google Sheet 捕获 ContentService 返回
- python - TypeError:不能将序列乘以“numpy.float64”类型的非整数(复数)
- php - Laravel 队列有时会重复一个作业
- gcc - RISC-V 工具链错误:未知伪操作:`.insn'