sql - Azure SQL如何获取数组中满足条件的第一个元素

标签 sql azure azure-cosmosdb

我有一个带有 body 的集合:

{
    "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
}

我想通过 first lastEvents.control 字段过滤它。现在我正在使用:

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

但是这个查询遍历所有lastEvent数组。就我而言,我必须仅检查带有 control 字段的第一个元素。 我怎样才能达到预期的行为?

最佳答案

如果我没有误解的话,您想要获取 lastEvents 数组中第一个元素具有 control 字段的文档,并且它需要包含“recovered”字符串.

如果是这样,SQL就无法达到您的要求。

解决方法:

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

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

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

关于sql - Azure SQL如何获取数组中满足条件的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65322162/

相关文章:

C#如何实现返回SQL结果列表的方法?

mysql - 并行查询 - SELECT 和 UPDATE - 选择太快或更新太慢问题

c# - 以编程方式调整 Azure 虚拟机大小的语法

powershell - 设置-AzureServiceDiagnosticsExtension : Cannot bind parameter 'StorageContext'

azure - 哪些 CosmosDb 操作会导致 Azure 函数触发?

.net - Cosmos DB : Collection exists, 但抛出 410 GONE httpstatus 代码

mysql - 平均优化sql结果集

.net - 排查 App Insight 仅显示部分日志的问题

azure - DocumentDB 模拟器 .Net Core 快速入门未加载

php - 对子查询 mysql 使用 IN 之外的其他内容