我正在使用C#SQL Api(DocumentDB)处理Azure Cosmos DB的项目,并且需要知道是否可以使用不区分大小写的WHERE子句。从我在网上找到的内容来看似乎还不可能。
我想写一个像:
这样的查询SELECT l.CustomerName, l.LogDetail
FROM Logs l
WHERE l.CustomerName = 'Acme'
并返回客户名称等于“ACME”,“Acme”或甚至“aCmE”的文档。我不想在扫描中受到性能影响。我更喜欢让查询使用索引。
我知道我可以创建第二个CustomerName字段,其中包含要过滤的所有小写值,但我希望看看是否可以避免这种情况。这可能吗?
答案 0 :(得分:1)
不幸的是,除非在过去两个月内添加,这是不可能的。
如果在索引字段上使用ToLower()或ToUpper(),则会导致扫描,因此这不是一个选项。
一些有效的解决方案就像你说的那样,用一个不区分大小写的字符串添加另一个字段,或者只插入具有特定情况的数据。听起来你的数据库不区分大小写,所以为什么不确保这些情况真的不敏感呢?
答案 1 :(得分:1)
在撰写本文时,现在有一个LOWER函数可用于Cosmos SQL API查询。这将使您能够像这样编写查询:
SELECT l.CustomerName, l.LogDetail
FROM Logs l
WHERE LOWER(l.CustomerName) = 'acme'
Here are the docs用于LOWER功能。
答案 2 :(得分:0)
现在有一个StringEquals函数,可用于进行不区分大小写的比较。
SELECT STRINGEQUALS("abc", "abc", false) AS c1, STRINGEQUALS("abc", "ABC", false) AS c2, STRINGEQUALS("abc", "ABC", true) AS c3
返回
[{
"c1": true,
"c2": false,
"c3": true
}]
以下是文档-https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-stringequals