Azure Cosmos DB查询:基于经办人筛选在单列中获取嵌套JSON的任务及子任务名称
解决Azure Cosmos DB任务与子任务的经办人筛选及合并问题
我来帮你搞定这个查询需求!针对你提供的JSON结构,咱们可以利用Azure Cosmos DB的数组函数和子查询来实现,完全不需要用到Union操作。核心思路是先筛选目标项目,然后分别提取符合经办人条件的主任务和子任务名称,再把它们合并到同一列中。
完整查询语句
SELECT flattened.ItemName AS TaskOrSubTaskName FROM c WHERE c.ProjectName = "Abc" CROSS APPLY ( SELECT ARRAY_FLATTEN( ARRAY_CONCAT( -- 提取符合条件的主任务名称 (SELECT VALUE t.TaskName FROM t IN c.Tasks WHERE t.Assignee = "Abdul Saleem"), -- 提取符合条件的子任务名称 (SELECT VALUE st.SubTaskName FROM t IN c.Tasks JOIN st IN t.SubTasks WHERE st.Assignee = "Abdul Saleem") ), 1 ) AS AllItems ) AS combined CROSS APPLY (SELECT VALUE item FROM item IN combined.AllItems) AS flattened
逐部分解释
- 筛选目标项目:通过
WHERE c.ProjectName = "Abc"定位到你需要的项目文档。 - 提取主任务名称:第一个子查询
(SELECT VALUE t.TaskName FROM t IN c.Tasks WHERE t.Assignee = "Abdul Saleem")会遍历所有主任务,只保留经办人是"Abdul Saleem"的任务名称,返回一个字符串数组。 - 提取子任务名称:第二个子查询
(SELECT VALUE st.SubTaskName FROM t IN c.Tasks JOIN st IN t.SubTasks WHERE st.Assignee = "Abdul Saleem")先展开主任务,再遍历每个主任务下的子任务,筛选出符合经办人条件的子任务名称,同样返回一个字符串数组。 - 合并并打平数组:用
ARRAY_CONCAT把主任务和子任务的数组合并成一个二维数组,再用ARRAY_FLATTEN(..., 1)把二维数组转换成一维数组,这样所有符合条件的任务和子任务名称就都在一个数组里了。 - 展开成单列:最后通过两次
CROSS APPLY把数组里的每个元素单独成行,最终得到一列包含所有匹配名称的结果。
针对你提供的示例数据,查询结果会是这样:
| TaskOrSubTaskName |
|---|
| Create Customer Profile |
| Create Customer Profile |
| t5 |
| t5 |
这样就完美实现了你要的:筛选特定项目,按经办人提取所有任务和对应子任务名称到同一列的需求。
内容的提问来源于stack exchange,提问作者Sahaduna
相关产品推荐
相关产品推荐

