Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pencarian case-sensitive di Oracle

Ada 3 cara utama untuk melakukan pencarian case-insensitive di Oracle tanpa menggunakan indeks teks lengkap.

Pada akhirnya metode apa yang Anda pilih tergantung pada keadaan pribadi Anda; hal utama yang harus diingat adalah bahwa untuk meningkatkan kinerja, Anda harus mengindeks dengan benar untuk pencarian yang peka huruf besar/kecil.

1. Huruf besarkan kolom dan string Anda secara identik.

Anda dapat memaksa semua data Anda menjadi kasus yang sama dengan menggunakan UPPER() atau LOWER() :

select * from my_table where upper(column_1) = upper('my_string');

atau

select * from my_table where lower(column_1) = lower('my_string');

Jika column_1 tidak diindeks di upper(column_1) atau lower(column_1) , jika sesuai, ini mungkin memaksa pemindaian tabel penuh. Untuk menghindari ini, Anda dapat membuat indeks berbasis fungsi.

create index my_index on my_table ( lower(column_1) );

Jika Anda menggunakan LIKE maka Anda harus menggabungkan % di sekitar string yang Anda cari.

select * from my_table where lower(column_1) LIKE lower('my_string') || '%';

SQL Fiddle ini menunjukkan apa yang terjadi di semua kueri ini. Perhatikan Rencana Penjelasan, yang menunjukkan kapan indeks sedang digunakan dan kapan tidak.

2. Gunakan ekspresi reguler.

Dari Oracle 10g dan seterusnya REGEXP_LIKE() tersedia. Anda dapat menentukan _match_parameter_ 'i' , untuk melakukan pencarian peka huruf besar/kecil.

Untuk menggunakan ini sebagai operator kesetaraan, Anda harus menentukan awal dan akhir string, yang dilambangkan dengan karat dan tanda dolar.

select * from my_table where regexp_like(column_1, '^my_string$', 'i');

Untuk melakukan yang setara dengan LIKE, ini dapat dihapus.

select * from my_table where regexp_like(column_1, 'my_string', 'i');

Hati-hati dengan ini karena string Anda mungkin berisi karakter yang akan ditafsirkan berbeda oleh mesin ekspresi reguler.

SQL Fiddle ini menampilkan contoh output yang sama kecuali menggunakan REGEXP_LIKE().

3. Ubah di tingkat sesi.

Parameter NLS_SORT mengatur urutan pemeriksaan untuk pemesanan dan berbagai operator perbandingan, termasuk = Dan suka. Anda dapat menentukan biner, tidak peka huruf besar/kecil, mengurutkan dengan mengubah sesi. Ini berarti bahwa setiap kueri yang dilakukan dalam sesi tersebut akan menampilkan parameter peka huruf besar/kecil.

alter session set nls_sort=BINARY_CI

Ada banyak informasi tambahan seputar pengurutan linguistik dan pencarian string jika Anda ingin menentukan bahasa yang berbeda, atau melakukan pencarian tidak sensitif aksen menggunakan BINARY_AI.

Anda juga perlu mengubah parameter NLS_COMP; mengutip:

Operator pasti dan klausa kueri yang mematuhi parameter NLS_SORT bergantung pada nilai parameter NLS_COMP. Jika suatu operator atau klausa tidak mematuhi nilai NLS_SORT, sebagaimana ditentukan oleh NLS_COMP, susunan yang digunakan adalah BINARY.

Nilai default NLS_COMP adalah BINARY; tetapi, LINGUISTIC menetapkan bahwa Oracle harus memperhatikan nilai NLS_SORT:

Perbandingan untuk semua operasi SQL dalam klausa WHERE dan dalam blok PL/SQL harus menggunakan jenis linguistik yang ditentukan dalam parameter NLS_SORT. Untuk meningkatkan performa, Anda juga dapat menentukan indeks alinguistik pada kolom yang Anda inginkan untuk perbandingan linguistik.

Jadi, sekali lagi, Anda perlu mengubah sesi

alter session set nls_comp=LINGUISTIC

Seperti disebutkan dalam dokumentasi, Anda mungkin ingin membuat indeks linguistik untuk meningkatkan kinerja

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. Ubah VARCHAR2 menjadi Angka

  2. Transformasi Baris ke Kolom Oracle

  3. Oracle - Cara menghasilkan skrip dari pengembang sql

  4. Bagaimana Melewati Daftar Objek Java ke Oracle Stored Procedure Menggunakan MyBatis?

  5. Cara mengembalikan parameter keluaran Oracle dari prosedur tersimpan di .NET