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

问题描述 投票:0回答:2

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

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

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

这里,

pi
是一个字符串值,可以是
09001001
09025001

有没有办法在 Cosmos DB 中使用

LIKE
命令?

我知道cosmos DB使用

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

azure azure-cosmosdb azure-cosmosdb-sqlapi
2个回答
70
投票

更新:

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

示例:

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

旧答案:

这可以通过两种方式实现

(i) 目前

Azure Cosmosdb
支持
CONTAINS
STARTSWITH
ENDSWITH
内置函数,相当于LIKE。

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")

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 的情况似乎并非如此(目前)。

更新:

RegexMatch
函数现在可以利用范围索引来检查字符串开头或结尾的特定字符的模式。

© www.soinside.com 2019 - 2024. All rights reserved.