Der er 3 hovedmåder til at udføre en søgning uden store og små bogstaver i Oracle uden at bruge fuldtekstindekser.
Hvilken metode du vælger afhænger i sidste ende af dine individuelle forhold; den vigtigste ting at huske er, at for at forbedre ydeevnen skal du indeksere korrekt til søgning uden store og små bogstaver.
1. Indstil din kolonne og din streng identisk.
Du kan tvinge alle dine data til at have samme store og små bogstaver ved at bruge UPPER()
eller LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
eller
select * from my_table where lower(column_1) = lower('my_string');
Hvis column_1
er ikke indekseret på upper(column_1)
eller lower(column_1)
, hvis det er relevant, kan dette fremtvinge en fuld tabelscanning. For at undgå dette kan du oprette et funktionsbaseret indeks.
create index my_index on my_table ( lower(column_1) );
Hvis du bruger LIKE, skal du sammenkæde en %
omkring den streng, du søger efter.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Denne SQL Fiddle demonstrerer, hvad der sker i alle disse forespørgsler. Bemærk Forklar-planerne, som angiver, hvornår et indeks bliver brugt, og hvornår det ikke er det.
2. Brug regulære udtryk.
Fra Oracle 10g og fremefter REGEXP_LIKE()
er tilgængelig. Du kan angive _match_parameter_ 'i'
, for at udføre søgning uden forskel på store og små bogstaver.
For at bruge dette som en lighedsoperator skal du angive starten og slutningen af strengen, som er angivet med karat og dollartegnet.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
For at udføre det, der svarer til LIKE, kan disse fjernes.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Vær forsigtig med dette, da din streng kan indeholde tegn, der vil blive fortolket anderledes af den regulære udtryksmotor.
Denne SQL Fiddle viser dig det samme outputeksempel undtagen ved brug af REGEXP_LIKE().
3. Skift det på sessionsniveau.
NLS_SORT-parameteren styrer sorteringssekvensen for bestilling og de forskellige sammenligningsoperatorer, inklusive =
og LIKE. Du kan angive en binær, ufølsom sortering ved at ændre sessionen. Dette vil betyde, at hver forespørgsel, der udføres i den pågældende session, vil udføre parametre, der ikke skelner mellem store og små bogstaver.
alter session set nls_sort=BINARY_CI
Der er masser af yderligere information omkring sproglig sortering og strengsøgning, hvis du vil angive et andet sprog eller lave en accentufølsom søgning ved hjælp af BINARY_AI.
Du skal også ændre parameteren NLS_COMP; for at citere:
De nøjagtige operatorer og forespørgselsudtryk, der overholder parameteren NLS_SORT, afhænger af værdien af parameteren NLS_COMP. Hvis en operator eller klausul ikke overholder NLS_SORT-værdien, som bestemt af NLS_COMP, er den anvendte sortering BINÆR.
Standardværdien for NLS_COMP er BINARY; men LINGUISTIC specificerer, at Oracle skal være opmærksom på værdien af NLS_SORT:
Sammenligninger for alle SQL-operationer i WHERE-udtrykket og i PL/SQL-blokke skal bruge den sproglige sortering, der er angivet i NLS_SORT-parameteren. For at forbedre ydeevnen kan du også definere et sprogligt indeks på den kolonne, som du ønsker sproglige sammenligninger for.
Så endnu en gang skal du ændre sessionen
alter session set nls_comp=LINGUISTIC
Som nævnt i dokumentationen vil du måske oprette et sprogligt indeks for at forbedre ydeevnen
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));