Поведение по умолчанию LIKE
и других операторов сравнения и =
т. Д. Чувствительно к регистру.
Можно ли сделать их без учета регистра?
sql
oracle
case-sensitive
case-insensitive
sql-like
sergionni
источник
источник
REGEXP_LIKE(username,'me','i')
вместо как, как?Ответы:
Начиная с 10gR2, Oracle позволяет тонко настраивать поведение сравнения строк, устанавливая параметры
NLS_COMP
иNLS_SORT
сессию:Вы также можете создавать регистры без учета регистра:
Эта информация была взята из поисков без учета регистра Oracle . В статье упоминается,
REGEXP_LIKE
но, похоже, она работает и со старым добрым=
.В версиях старше 10gR2 это не может быть сделано, и обычный подход, если вам не нужен нечувствительный к акценту поиск, заключается просто
UPPER()
в столбце и поисковом выражении.источник
LIKE
выражения (например,WHERE foo LIKE '%abc%'
) уже достаточно медленные, если их нельзя проиндексировать, я не думаю, что это определенно связано с чувствительностью к регистру.DBD::Oracle
, вы можете написать$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
перед вызовом `DBI-> connect`.ALTER SESSION
только изменяет ваш локальный экземпляр исправления и означает ли это, как ваш текущий сеанс, то есть, если я закрою и снова открою, он будет сброшен. Есть ли способ, которым я могу видеть текущие значения, чтобы, если он сохранялся везде, я мог вернуться к исходным настройкам ...Существует 3 основных способа выполнения поиска без учета регистра в Oracle без использования полнотекстовых индексов.
В конечном итоге, какой метод вы выберете, зависит от ваших индивидуальных обстоятельств; Главное, что нужно помнить, это то, что для повышения производительности вы должны правильно индексировать для поиска без учета регистра.
1. Обсудите ваш столбец и строку одинаково.
Вы можете заставить все ваши данные быть в одном и том же случае с помощью
UPPER()
илиLOWER()
:или
Если
column_1
индекс не включенupper(column_1)
илиlower(column_1)
, в зависимости от ситуации, это может привести к полному сканированию таблицы. Чтобы избежать этого, вы можете создать индекс на основе функций .Если вы используете LIKE, вы должны объединить
%
вокруг искомой строки.Эта скрипта SQL демонстрирует, что происходит во всех этих запросах. Обратите внимание на планы объяснения, которые указывают, когда индекс используется, а когда нет.
2. Используйте регулярные выражения.
От Oracle 10g и
REGEXP_LIKE()
более доступна. Вы можете указать _match_parameter_'i'
, чтобы выполнить поиск без учета регистра.Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которая обозначается в каратах и знаком доллара.
Чтобы выполнить эквивалент LIKE, их можно удалить.
Будьте осторожны с этим, поскольку ваша строка может содержать символы, которые будут по-разному интерпретироваться механизмом регулярных выражений.
Эта SQL Fiddle показывает тот же пример вывода, за исключением использования REGEXP_LIKE ().
3. Измените его на уровне сеанса.
Параметр NLS_SORT управляет последовательностью сортировки для упорядочения и различных операторов сравнения, в том числе
=
и LIKE. Вы можете указать двоичную сортировку без учета регистра, изменив сеанс. Это будет означать, что каждый запрос, выполненный в этом сеансе, будет выполнять параметры без учета регистра.Существует много дополнительной информации о лингвистической сортировке и поиске строк, если вы хотите указать другой язык или выполнить нечувствительный к акценту поиск с помощью BINARY_AI.
Вам также необходимо изменить параметр NLS_COMP ; Цитировать:
Значением по умолчанию NLS_COMP является BINARY; но LINGUISTIC указывает, что Oracle должен обратить внимание на значение NLS_SORT:
Итак, еще раз, вам нужно изменить сеанс
Как отмечено в документации, вы можете создать лингвистический индекс для повышения производительности.
источник
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
вместоselect * from my_table where lower(column_1) LIKE lower('my_string%');
? Это дает какое-то преимущество?regexp_like
, есть ли способ избежать таких строк? Например, если в строке есть $, результат будет не таким, как мы ожидаем. // cc @Ben и другие, пожалуйста, поделитесь.`
это escape-символ @bozzmob. Не должно быть никакой разницы в выводе, если строка, над которой работает регулярное выражение, содержит a$
, это может вызвать проблемы только в том случае, если вам нужно$
литерал в регулярном выражении. Если у вас есть конкретная проблема, я бы задал другой вопрос, если этот комментарий / ответ не помог.может быть, вы можете попробовать использовать
источник
WHERE upper(user_name) LIKE UPPER('%ME%')
тогда? :)UPPER
параметр ввода тоже?upper
функции вы теряете индекс, у вас есть идеи, как сделать поиск с помощью индекса?Из Oracle 12c R2 вы можете использовать
COLLATE operator
:Демо-версия:
db <> Fiddle demo
источник
источник
%
«s в первом аргументе вашего второйNLSSORT
являются не значит быть подстановочными, верно? Они отчасти смущают.Вы можете сделать что-то подобное:
источник