如何在 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
是一个字符串值,可以是09001001
或09025001
。
有没有办法在 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
,STARTSWITH
和ENDSWITH
等价于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 的情况(目前)。
我想使用以下查询从 Cosmos DB 检索数据:
SELECT * FROM c WHERE c.pi like '09%001'
(这是一个 SQL 查询,我可以在 MySQL 中使用它)
这里,pi
是一个字符串值,可以是09001001
或09025001
。
有没有办法在 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
,STARTSWITH
和ENDSWITH
等价于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 的情况(目前)。