首页 > 解决方案 > Azure SQL如何获取满足条件的数组中的第一个元素

问题描述

我有一个身体系列:

{
    "id": "666",
    "name": "Test",
    "lastEvents": [
        {
            "show": false,
            "eventType": "TYPE_1",
            "creationDateTime": "2020-08-16T11:59:00"
        },
        {
            "show": false,
            "eventType": "TYPE_33",
            "creationDateTime": "2020-10-14T06:11:00",
            "control": "test repaired"
        },
        {
            "show": false,
            "eventType": "TYPE_33",
            "creationDateTime": "2020-10-14T06:08:00",
            "control": "test recovered"
        }
    ],
    "_rid": "kgsjAN-JFWEDQEQWESDAD==",
    "_self": "JFWE=/docs/kgsjAN-JFWEDQEQWESDAD==/dbs/kgsjAA==/colls/kgsjAN",
    "_etag": "\"666-0000-750011b7-0000-5eec704f0000\"",
    "_attachments": "attachments/",
    "_ts": 1592873510
}

我想按第一个 lastEvents.control字段过滤它。现在我正在使用:

SELECT * 
FROM root r
WHERE EXISTS(
        SELECT VALUE n                              
        FROM n IN r.lastEventFields                             
        WHERE CONTAINS(n.control, "recovered", true)
)

但此查询贯穿所有 lastEvent 数组。就我而言,我只需要检查第一个带有字段的元素。control我怎样才能达到预期的行为?

标签: sqlazureazure-cosmosdb

解决方案


如果我没有误解,您想获取作为数组中第一个元素的文档,controllastEvents需要包含“已恢复”字符串。

如果是这样,SQL 无法满足您的要求。

解决方法:

1.创建UDF和循环lastEvents数组。UDF 价格昂贵,请注意。如果需要,我可以提供 JS 代码。

2.在您的文档中添加一个文件,以在您保存/更新您的文档之前检查它是否满足您在客户端的需求。如果您经常更新文档,这不是一个好的选择。

3.获取所有文件并在客户端过滤它们。


推荐阅读