如何在 Azure CosmosDB 中编写 LIKE 查询?

How to write a LIKE query in Azure CosmosDB?

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

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

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

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

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

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

更新:

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

示例:

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

旧答案:

这可以通过两种方式实现

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

Cosmosdb 中 LIKE 的关键字是包含。

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 User Defined Functions :

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

SELECT udf.EXECUTE_REGEX("foobar", ".*bar")

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

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

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

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

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

更新:

Cosmos 现在有一个 RegexMatch function that can do the same. While the documentation for the MongoApi mentions the $regex 可以使用索引来优化您的查询,如果它遵守某些规则,这似乎不是 SqlApi 的情况(目前)。