Perilaku default LIKE
dan operator pembanding lainnya, =
dll peka huruf besar-kecil.
Apakah mungkin membuat mereka tidak peka terhadap huruf besar-kecil?
sql
oracle
case-sensitive
case-insensitive
sql-like
sergionni
sumber
sumber
REGEXP_LIKE(username,'me','i')
bukannya LIKE?Jawaban:
Sejak 10gR2, Oracle memungkinkan untuk menyempurnakan perilaku perbandingan string dengan mengatur parameter
NLS_COMP
danNLS_SORT
sesi:Anda juga dapat membuat indeks case sensitive:
Informasi ini diambil dari pencarian tidak sensitif case Oracle . Artikel itu menyebutkan
REGEXP_LIKE
tetapi tampaknya bekerja dengan baik=
juga.Dalam versi yang lebih tua dari 10gR2 itu tidak dapat benar-benar dilakukan dan pendekatan yang biasa, jika Anda tidak memerlukan pencarian tidak peka-aksen , adalah hanya
UPPER()
kolom dan ekspresi pencarian.sumber
LIKE
Ekspresi sewenang-wenang (misalnyaWHERE foo LIKE '%abc%'
) sudah cukup lambat jika mereka tidak dapat diindeks, saya tidak berpikir itu terkait dengan sensitivitas huruf.DBD::Oracle
, Anda dapat menulis$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
sebelum memanggil `DBI-> connect`.ALTER SESSION
hanya mengubah instance lokal Anda dari koreksi dan apakah itu berarti seperti sesi Anda saat ini yaitu jika saya menutup dan membuka kembali itu akan reset. Apakah ada cara agar saya dapat melihat apa nilai saat ini sehingga jika tetap ada di mana-mana saya dapat kembali ke pengaturan semula ...Ada 3 cara utama untuk melakukan pencarian case-insensitive di Oracle tanpa menggunakan indeks teks lengkap.
Pada akhirnya, metode apa yang Anda pilih bergantung pada keadaan pribadi Anda; hal utama yang harus diingat adalah untuk meningkatkan kinerja Anda harus mengindeks dengan benar untuk pencarian case-sensitive.
1. Hurufkan kolom dan string Anda secara identik.
Anda dapat memaksa semua data Anda menjadi kasus yang sama dengan menggunakan
UPPER()
atauLOWER()
:atau
Jika
column_1
tidak diindeks padaupper(column_1)
ataulower(column_1)
, jika sesuai, ini mungkin memaksa pemindaian tabel penuh. Untuk menghindari ini, Anda dapat membuat indeks berbasis fungsi .Jika Anda menggunakan LIKE maka Anda harus menyatukan
%
sekitar string yang Anda cari.SQL Fiddle ini menunjukkan apa yang terjadi di semua kueri ini. Perhatikan Rencana Jelaskan, yang menunjukkan kapan indeks 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 case-insensitive.Untuk menggunakan ini sebagai operator kesetaraan, Anda harus menentukan awal dan akhir string, yang dilambangkan dengan karat dan tanda dolar.
Untuk melakukan yang setara dengan LIKE, ini dapat dihapus.
Hati-hati dengan ini karena string Anda mungkin berisi karakter yang akan ditafsirkan berbeda oleh mesin ekspresi reguler.
SQL Fiddle ini menunjukkan kepada Anda contoh output yang sama kecuali menggunakan REGEXP_LIKE ().
3. Ubah di tingkat sesi.
The NLS_SORT parameter mengatur urutan pemeriksaan untuk pemesanan dan berbagai operator perbandingan, termasuk
=
dan SEBAGAINYA. Anda bisa menentukan jenis biner, tidak peka huruf besar-kecil, dengan mengubah sesi. Ini berarti bahwa setiap kueri yang dilakukan dalam sesi itu akan melakukan parameter case-insensitive.Ada banyak informasi tambahan seputar penyortiran linguistik dan pencarian string jika Anda ingin menentukan bahasa yang berbeda, atau melakukan pencarian yang peka terhadap aksen menggunakan BINARY_AI.
Anda juga perlu mengubah parameter NLS_COMP ; kutipan:
Nilai default NLS_COMP adalah BINARY; tetapi, LINGUISTIC menetapkan bahwa Oracle harus memperhatikan nilai NLS_SORT:
Jadi, sekali lagi, Anda perlu mengubah sesi
Sebagaimana dicatat dalam dokumentasi Anda mungkin ingin membuat indeks linguistik untuk meningkatkan kinerja
sumber
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
daripada melakukanselect * from my_table where lower(column_1) LIKE lower('my_string%');
? Apakah ada manfaatnya?regexp_like
, apakah ada cara untuk melarikan diri dari string seperti itu? Memberi contoh, jika string memiliki $, output tidak akan seperti yang kita harapkan. // cc @Ben dan yang lainnya tolong lakukan berbagi.`
adalah karakter escape @bozzmob. Seharusnya tidak ada perbedaan dalam output jika string ekspresi reguler beroperasi berisi$
, ini hanya dapat menyebabkan masalah jika Anda memerlukan$
literal dalam ekspresi reguler Anda. Jika Anda memiliki masalah tertentu, saya akan mengajukan pertanyaan lain jika komentar / jawaban ini tidak membantu.mungkin Anda bisa mencoba menggunakan
sumber
WHERE upper(user_name) LIKE UPPER('%ME%')
? :)UPPER
parameter input juga?upper
fungsi Anda kehilangan indeks, apakah Anda tahu cara melakukan pencarian menggunakan indeks?Dari Oracle 12c R2 Anda dapat menggunakan
COLLATE operator
:Demo:
db <> demo biola
sumber
sumber
%
's dalam argumen pertama untuk kedua AndaNLSSORT
yang tidak dimaksudkan untuk menjadi wildcard, kan? Mereka agak bingung.Anda dapat melakukan sesuatu seperti itu:
sumber