sql - 如何在 CosmosDB 中对字典键进行不区分大小写的搜索?
问题描述
我想不出一种方法来对 ComsosDB 中的字典键进行不区分大小写的搜索。我的对象如下所示:
...
"Codes": {
"CodeSystem1": [
"A1", "A2"
],
"CodeSystem2": [
"x1","x2"
]
},
...
代码是一个Dictionary<string, List<string>>
我的查询如下所示:
SELECT * FROM c WHERE ARRAY_CONTAINS(c.Codes["CodeSystem2"], 'x1')
但是,我想对字典键和值都执行 LOWER(),但它不是那样工作的。
SELECT * FROM c WHERE ARRAY_CONTAINS(c.Codes[LOWER("CodeSystem2"]), LOWER('x1'))
有任何想法吗?我不能更改对象的结构,也不能在我的 .NET 代码中进行过滤。
解决方案
LOWER/UPPER 不会像您希望的那样与 Array 元素一起使用。如果你有这样的事情:
"CodeSystem4": [
"Z1"
],
"CodeSystem5": "Z3"
我们可以使用下面的元素 CodeSystem5 如下:
select * from c where lower(c.Codes["CodeSystem5"]) = Lower('Z3')
但是我们不能对带有 ARRAY_CONTAINS 的 'CodeSystem4' 做同样的事情,它不会返回任何结果。
同样根据下面的文章,“ LOWER 系统函数不使用索引。如果您打算进行频繁的不区分大小写的比较,则 LOWER 系统函数可能会消耗大量的 RU。如果是这种情况,请不要使用LOWER系统功能,每次比较数据归一化,插入时可以对套管进行归一化。 "
https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-lower
一种方法是添加另一个小写的可搜索数组以使其通过查询工作。否则我们可以通过 SDK 过滤
推荐阅读
- python - 在 Python 中合并两个长度相等的数据集
- python - PIL 仅通过打开和保存来减小图像大小
- database - 双活数据库架构与基于副本集的传统架构有何不同?
- symfony - 如何在 symfony 路由中使用变量的要求
- c# - C#如何在单词表中垂直合并后访问单元格?
- android - 与 Apple SpriteKit 等效的 Android 框架
- vb.net - 以 Visual Basic 形式在后台运行计时器
- jboss-tools - 错误在来自 keycloak-gatekeeper 的请求中找不到会话
- angular - 如何在 Angular 中使用 Cheerio?
- php - 时间段预订脚本 - 检查可用性