38

我想使用以下查询从 Cosmos DB 中检索数据:

SELECT * FROM c WHERE c.pi like '09%001'

(这是一个 SQL 查询,我可以在 MySQL 中使用)

这里,pi是一个字符串值,可以是0900100109025001

有没有办法LIKE在 Cosmos DB 中使用命令?

我知道 cosmos DB 使用CONTAINS,但是当您想专门匹配字符串的开头或结尾时,不能使用它。

4

2 回答 2

66

更新 :

现在可以使用LIKE 关键字在 Azure Cosmos DB SQL(核心)API 中进行文本搜索!

例子:

SELECT *
FROM c
WHERE c.description LIKE "%cereal%"

老答案:

这可以通过两种方式实现

(i) 目前Azure Cosmosdb支持等价于 LIKE 的CONTAINS, STARTSWITH, 和ENDSWITH内置函数。

Cosmosdb 中 LIKE 的关键字是 Contains 。

SELECT * FROM c WHERE CONTAINS(c.pi, '09')

所以,在你的情况下,如果你想匹配模式09%001,你需要使用:

SELECT * FROM c WHERE STARTSWITH(c.pi, '09') AND ENDSWITH(c.pi, '001')

(ii) 如 404 所述,使用支持正则表达式的SQL API用户定义函数:

function executeRegex(str, pattern) {
    let regex=RegExp(pattern);
    return regex.test(str);
}

SELECT udf.EXECUTE_REGEX("foobar", ".*bar")
于 2018-05-29T06:18:08.923 回答
2

另一种可能性是创建自己的用户定义函数。例如,这里是一个正则表达式检查:

function matchRegex(str, pattern) {
    let regex=RegExp(pattern);
    return regex.test(str);
}

以名称创建,MATCH_REGEX然后可以像这样使用:

SELECT udf.MATCH_REGEX("09001001", "^09.*001$")

注意:它会杀死任何索引优化,例如STARTSWITH。虽然允许更复杂的模式。因此,使用能够使用索引缩小搜索范围的附加过滤器可能是有益的。例如,在子句中使用StartsWith(c.property1, '09')作为上述示例的补充。WHERE

更新:

Cosmos 现在有一个RegexMatch function可以做同样的事情。虽然 MongoApi 的文档提到$regex如果它遵守某些规则,可以使用索引来优化您的查询,但这似乎不是 SqlApi 的情况(目前)。

于 2020-03-05T10:22:43.613 回答