Istnieją 3 główne sposoby przeprowadzania wyszukiwania bez rozróżniania wielkości liter w Oracle bez używania indeksów pełnotekstowych.
Ostatecznie wybór metody zależy od indywidualnych okoliczności; najważniejszą rzeczą do zapamiętania jest to, że aby poprawić wydajność, musisz poprawnie indeksować wyszukiwanie bez uwzględniania wielkości liter.
1. Przypisz identyczną kolumnę i ciąg znaków.
Możesz wymusić, aby wszystkie dane były takie same, używając UPPER()
lub LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
lub
select * from my_table where lower(column_1) = lower('my_string');
Jeśli column_1
nie jest indeksowany na upper(column_1)
lub lower(column_1)
, odpowiednio, może to wymusić pełne skanowanie tabeli. Aby tego uniknąć, możesz utworzyć indeks oparty na funkcjach.
create index my_index on my_table ( lower(column_1) );
Jeśli używasz LIKE, musisz połączyć %
wokół ciągu, którego szukasz.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Ten SQL Fiddle pokazuje, co dzieje się we wszystkich tych zapytaniach. Zwróć uwagę na plany wyjaśniania, które wskazują, kiedy indeks jest używany, a kiedy nie.
2. Użyj wyrażeń regularnych.
Od Oracle 10g wzwyż REGEXP_LIKE()
jest dostępny. Możesz określić _match_parameter_ 'i'
, aby przeprowadzić wyszukiwanie bez rozróżniania wielkości liter.
Aby użyć tego jako operatora równości, musisz określić początek i koniec ciągu, który jest oznaczony karatem i znakiem dolara.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
Aby wykonać odpowiednik LIKE, można je usunąć.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Uważaj na to, ponieważ Twój ciąg może zawierać znaki, które będą różnie interpretowane przez silnik wyrażeń regularnych.
To SQL Fiddle pokazuje te same przykładowe dane wyjściowe, z wyjątkiem użycia REGEXP_LIKE().
3. Zmień to na poziomie sesji.
Parametr NLS_SORT reguluje kolejność sortowania dla porządkowania i różne operatory porównania, w tym =
i LUBIĘ. Możesz określić plik binarny, bez rozróżniania wielkości liter, sortując, zmieniając sesję. Oznacza to, że każde zapytanie wykonane w tej sesji będzie wykonywać parametry bez uwzględniania wielkości liter.
alter session set nls_sort=BINARY_CI
Istnieje wiele dodatkowych informacji na temat sortowania lingwistycznego i wyszukiwania ciągów, jeśli chcesz określić inny język lub przeprowadzić wyszukiwanie bez rozróżniania akcentów za pomocą BINARY_AI.
Będziesz także musiał zmienić parametr NLS_COMP; cytować:
Dokładne operatory i klauzule zapytań, które są zgodne z parametrem NLS_SORT, zależą od wartości parametru NLS_COMP. Jeśli operator lub klauzula nie jest zgodna z wartością NLS_SORT, określoną przez NLS_COMP, używane jest sortowanie BINARNE.
Domyślna wartość NLS_COMP to BINARY; ale LINGUISTIC określa, że Oracle powinien zwrócić uwagę na wartość NLS_SORT:
Porównania dla wszystkich operacji SQL w klauzuli WHERE oraz w blokach PL/SQL powinny używać sortowania językowego określonego w parametrze NLS_SORT. Aby poprawić wydajność, możesz również zdefiniować indeks lingwistyczny w kolumnie, dla której chcesz porównać językowe.
Więc po raz kolejny musisz zmienić sesję
alter session set nls_comp=LINGUISTIC
Jak wspomniano w dokumentacji, możesz chcieć utworzyć indeks językowy, aby poprawić wydajność
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));