【问题标题】:How to write a LIKE query in Azure CosmosDB?如何在 Azure CosmosDB 中编写 LIKE 查询?
【发布时间】:2018-11-07 16:50:59
【问题描述】:

我想使用以下查询从 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


    【解决方案1】:

    更新:

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

    示例:

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

    旧答案:

    这可以通过两种方式实现

    (i) 目前Azure Cosmosdb支持CONTAINSSTARTSWITHENDSWITH strong> 等价于 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 User Defined Functions

    function executeRegex(str, pattern) {
        let regex=RegExp(pattern);
        return regex.test(str);
    }
    
    SELECT udf.EXECUTE_REGEX("foobar", ".*bar")
    

    【讨论】:

    • 这是部分解决方案。如果 pi 包含字符串 09001053 。然后将从数据库中获取此条目,并在您的答案中使用查询。那么解决方案是:`SELECT * FROM c WHERE STARTSWITH(c.pi, '09') AND ENDSWITH(c.pi,'001')。附言。我已经在你的链接上投票了。
    • 是的,您需要使用上述任一查询并尝试达到相同的效果
    【解决方案2】:

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

    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 可以做同样的事情。虽然 MongoApi 的文档提到 $regex 可以使用索引来优化您的查询,但前提是它遵守某些规则,但 SqlApi 似乎并非如此(目前)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多