我想使用以下查询从 Cosmos DB 检索数据:
SELECT * FROM c WHERE c.pi like '09%001'
(这是一个SQL查询,我可以在MySQL中使用)
这里,
pi
是一个字符串值,可以是09001001
或09025001
。
有没有办法在 Cosmos DB 中使用
LIKE
命令?
我知道cosmos DB使用
CONTAINS
,但是当你想专门匹配字符串的开头或结尾时,不能使用它。
更新:
您现在可以使用 LIKE 关键字 在 Azure Cosmos DB SQL(核心)API 中进行文本搜索!
示例:
SELECT *
FROM c
WHERE c.description LIKE "%cereal%"
旧答案:
这可以通过两种方式实现
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")
另一种可能性是创建您自己的用户定义函数。例如,这是一个正则表达式检查:
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
作为上述示例的补充。
更新:
RegexMatch function
可以做同样的事情。虽然 MongoApi 的文档提到 $regex
可以使用索引来优化您的查询(如果它遵守某些规则),但 SqlApi 的情况似乎并非如此(目前)。
更新:
RegexMatch
函数现在可以利用范围索引来检查字符串开头或结尾的特定字符的模式。