Oracle
 sql >> база данни >  >> RDS >> Oracle

Търсенето без регистри и букви в Oracle

Има 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'));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C# параметризирани заявки за Oracle - сериозна и опасна грешка!

  2. Проверете дали таблица съществува в Oracle

  3. NLS_CHARSET_DECL_LEN() Функция в Oracle

  4. dbms_output препълване на буфер с размер

  5. Експортирайте данни в JSON файл в Oracle 11g с помощта на PL/SQL