[英]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.