繁体   English   中英

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

[英]Azure SQL how to get first element in array which satisfies the condition

我有一个身体系列:

{
    "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字段的第一个元素 我怎样才能达到预期的行为?

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

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

解决方法:

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

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

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

您的查询不会为我返回任何数据。 这是一种以不同方式进行的方法

SELECT c.id, c.name, s.show, s.eventType, s.control, s.creationDateTime
FROM c
join s IN c.lastEvents
WHERE IS_DEFINED(s.control) AND CONTAINS(s.control, "recovered", true)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM