我想使用以下查询从 Cosmos DB 中检索数据:
SELECT * FROM c WHERE c.pi like '09%001'
(这是一个 SQL 查询,我可以在 MySQL 中使用)
这里,pi
是一个字符串值,可以是09001001
或09025001
。
有没有办法LIKE
在 Cosmos DB 中使用命令?
我知道 cosmos DB 使用CONTAINS
,但是当您想专门匹配字符串的开头或结尾时,不能使用它。
我想使用以下查询从 Cosmos DB 中检索数据:
SELECT * FROM c WHERE c.pi like '09%001'
(这是一个 SQL 查询,我可以在 MySQL 中使用)
这里,pi
是一个字符串值,可以是09001001
或09025001
。
有没有办法LIKE
在 Cosmos DB 中使用命令?
我知道 cosmos DB 使用CONTAINS
,但是当您想专门匹配字符串的开头或结尾时,不能使用它。
更新 :
现在可以使用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")
另一种可能性是创建自己的用户定义函数。例如,这里是一个正则表达式检查:
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 的情况(目前)。