Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyszukiwanie bez rozróżniania wielkości liter w Oracle

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'));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja pozwalająca na uzyskanie liczby dni tygodnia pomiędzy dwiema datami z wyłączeniem świąt

  2. Przykład funkcji Oracle, aby uzyskać liczbę dni między dwiema datami

  3. Dołącz do forum pytań i odpowiedzi dla programistów

  4. LITAGG w Oracle, aby zwrócić różne wartości

  5. 2 funkcje, aby uzyskać rok z daty w Oracle