Как выполнить поиск без учета регистра в Azure DocumentDb?

возможно ли выполнить поиск без учета регистра в DocumnetDb?

Допустим, у меня есть запись с ключом «имя» и значением «Timbaktu».

Это будет работать:

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

Это не будет:

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

Так как же сделать поиск без учета регистра?

Заранее спасибо.

С уважением.


person Codehelp    schedule 28.05.2015    source источник


Ответы (3)


Есть два способа сделать это. 1. используйте встроенную функцию НИЖНИЙ/ВЕРХНИЙ, например,

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

Однако для этого потребуется сканирование. Другой более эффективный способ - сохранить «канонизированную» форму, например. строчными буквами и используйте их для запросов. Например, JSON будет

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

Затем используйте его для запросов, например:

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

Надеюсь это поможет.

person Aravind Krishna R.    schedule 28.05.2015
comment
Аравинд, НИЖНЯЯ не работает. Запрос вернет пустой результат, когда предоставленная строка будет преобразована в LOWER, а фактическая строка в базе данных — нет. - person Codehelp; 29.05.2015
comment
Codehelp, по моему запросу я вызываю LOWER для строки в БД, верно? Я предполагаю, что переданная строка ниже, но вместо этого вы можете сделать что-то вроде LOWER(j.name) = LOWER('timbaktu') - person Aravind Krishna R.; 29.05.2015
comment
Aravind, это работает, когда переданная строка, будь то LOWER или любая другая, совпадает с тем, что находится в БД. Мой вопрос: есть ли у нас что-то вроде «COLLATE», как в SQL? - person Codehelp; 29.05.2015
comment
В DocumentDB нет эквивалента COLLATE. Строки представлены только в кодировке UTF-8 (согласно стандарту JSON). - person Aravind Krishna R.; 13.10.2015
comment
Azure Cosmos DB теперь поддерживает запросы без учета регистра с помощью функций Contains, EndsWith, StartsWith и StringsEquals. devblogs.microsoft.com/cosmosdb / - person Martin4ndersen; 21.06.2020
comment
@Martin4ndersen Мартин4ндерсен действительно выглядит так, но в SDK пока нет поддержки, поэтому для большинства пользователей его нельзя использовать до тех пор. - person Jean-Paul Smit; 09.07.2020
comment
Использование LOWER в вызове при попытке вернуть результаты, например SELECT * from c WHERE CONTAINS(LOWER(c.firstName), fred), чрезвычайно неэффективно и медленно. - person Brett Rigby; 22.07.2020

Cosmos недавно добавил параметр без учета регистра для строковых функций:

Теперь у вас есть возможность сделать следующие сравнения строк нечувствительными к регистру: Contains, EndsWith, StringEquals и StartsWith. и Значительные улучшения производительности были реализованы для этих строковых системных функций. Каждая из этих четырех строковых системных функций теперь выигрывает от индекса и, следовательно, будет иметь гораздо меньшую задержку и потребление единиц запросов (RU).

Объявление

person Noah Stahl    schedule 10.10.2020

Возможно, это древний случай, я просто хочу предоставить обходной путь.

Вы можете использовать UDF в базе данных Azure Cosmos.

удф:

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

И используйте ниже sql для запроса результатов:

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

введите здесь описание изображения

person Jay Gong    schedule 11.07.2018
comment
Просто интересно - это лучший подход, чем использование встроенных функций (НИЖНИЙ/ВЕРХНИЙ), как упоминалось выше? - person Sean; 04.01.2019