Има 3 основни начина за извършване на търсене, независимо от главните букви в Oracle, без да използвате пълнотекстови индекси.
В крайна сметка какъв метод ще изберете зависи от вашите индивидуални обстоятелства; Основното нещо, което трябва да запомните, е, че за да подобрите производителността, трябва да индексирате правилно за търсене, независимо от главните букви.
1. Случаите на колоната и низа са еднакви.
Можете да принудите всичките си данни да бъдат с един и същ регистър, като използвате UPPER()
или LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
или
select * from my_table where lower(column_1) = lower('my_string');
Ако column_1
не е индексиран в upper(column_1)
или lower(column_1)
, според случая, това може да наложи пълно сканиране на таблицата. За да избегнете това, можете да създадете индекс, базиран на функции.
create index my_index on my_table ( lower(column_1) );
Ако използвате LIKE, тогава трябва да свържете %
около низа, който търсите.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Тази SQL Fiddle демонстрира какво се случва във всички тези заявки. Обърнете внимание на Плановете за обяснение, които показват кога се използва индекс и кога не.
2. Използвайте регулярни изрази.
От Oracle 10g нататък REGEXP_LIKE()
е на разположение. Можете да посочите _match_parameter_ 'i'
, за да извършите търсене, независимо от главните букви.
За да използвате това като оператор за равенство, трябва да посочите началото и края на низа, който се обозначава с карата и знака за долар.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
За да изпълните еквивалента на LIKE, те могат да бъдат премахнати.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Внимавайте с това, тъй като низът ви може да съдържа знаци, които ще бъдат интерпретирани по различен начин от механизма за регулярни изрази.
Тази SQL Fiddle ви показва същия примерен изход, с изключение на използването на REGEXP_LIKE().
3. Променете го на ниво сесия.
Параметърът NLS_SORT управлява последователността на съпоставяне за подреждане и различните оператори за сравнение, включително =
и ХАРЕСВАНЕ. Можете да зададете двоично сортиране, независимо от главните букви, като промените сесията. Това ще означава, че всяка заявка, извършена в тази сесия, ще изпълнява параметри, независимо от главните букви.
alter session set nls_sort=BINARY_CI
Има много допълнителна информация относно езиковото сортиране и търсенето на низове, ако искате да посочите различен език или да извършите търсене без акцент с помощта на BINARY_AI.
Ще трябва също да промените параметъра NLS_COMP; да цитирам:
Точните оператори и клаузите за заявка, които се подчиняват на параметъра NLS_SORT, зависят от стойността на параметъра NLS_COMP. Ако оператор или клауза не се подчинява на стойността NLS_SORT, както е определено от NLS_COMP, използваното съпоставяне е BINARY.
Стойността по подразбиране на NLS_COMP е BINARY; но LINGUISTIC уточнява, че Oracle трябва да обърне внимание на стойността на NLS_SORT:
Сравненията за всички SQL операции в клаузата WHERE и в PL/SQLblocks трябва да използват езиковото сортиране, посочено в параметъра NLS_SORT. За да подобрите производителността, можете също да дефинирате лингвистичен индекс в колоната, за която искате лингвистични сравнения.
Така че отново трябва да промените сесията
alter session set nls_comp=LINGUISTIC
Както е отбелязано в документацията, може да искате да създадете лингвистичен индекс, за да подобрите производителността
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));