【问题标题】:How to do a Case Insensitive search on Azure DocumentDb?如何在 Azure DocumentDb 上进行不区分大小写的搜索?
【发布时间】:2020-10-11 02:37:26
【问题描述】:

是否可以在 DocumnetDb 上执行不区分大小写的搜索?

假设我有一条记录,'name' 键和值是“Timbaktu”

这将起作用:

select * from json j where j.name  = "Timbaktu"

这不会:

select * from json j where j.name  = "timbaktu"

那么如何进行不区分大小写的搜索呢?

提前致谢。

问候。

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    有两种方法可以做到这一点。 1.使用内置的LOWER/UPPER函数,例如,

    select * from json j where LOWER(j.name) = 'timbaktu'
    

    不过,这需要扫描。另一种更有效的方法是存储“规范化”形式,例如小写并将其用于查询。例如,JSON 将是

    { name: "Timbaktu", nameLowerCase: "timbaktu" }
    

    然后用它来查询:

    select * from json j WHERE j.nameLowerCase = "timbaktu"
    

    希望这会有所帮助。

    【讨论】:

    • Aravind,LOWER 不起作用。当提供的字符串转换为 LOWER 并且数据库中的实际字符串不是时,查询将返回空结果。
    • Codehelp,在我的查询中,我在数据库中的字符串上调用 LOWER,对吗?我假设传入的字符串较低,但您可以改为执行 LOWER(j.name) = LOWER('timbaktu')
    • Aravind,它在传入的字符串时起作用,无论是 LOWER 还是任何其他匹配 Db 中的内容。我的问题是我们在 SQL 中是否有类似“COLLATE”的东西?
    • DocumentDB 中没有 COLLATE 等价物。字符串仅以 UTF-8 表示(根据 JSON 标准)。
    • Azure Cosmos DB 现在支持通过函数ContainsEndsWithStartsWithStringsEquals 进行不区分大小写的查询。 devblogs.microsoft.com/cosmosdb/…
    【解决方案2】:

    Cosmos 最近为字符串函数添加了不区分大小写的选项:

    您现在可以选择进行这些字符串比较 不区分大小写:包含、EndsWith、StringEquals 和 StartsWith。 和显着的性能改进已经实现这些 字符串系统函数。这四个字符串系统函数中的每一个 现在受益于索引,因此延迟更低 并请求单位 (RU) 消耗。

    Announcement

    【讨论】:

      【解决方案3】:

      也许这是一个古老的案例,我只是想提供一个解决方法。

      您可以在 azure cosmos db 中使用 UDF

      udf:

      function userDefinedFunction(str){
          return str .toLowerCase();
      }
      

      并使用下面的sql查询结果:

      SELECT c.firstName FROM c where udf.lowerConvert(c.firstName) = udf.lowerConvert('John')
      

      【讨论】:

      • 只是想知道 - 这是否比使用上述内置函数 (LOWER/UPPER) 更好?
      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多