Det finns tre huvudsakliga sätt att utföra en skiftlägesokänslig sökning i Oracle utan att använda fulltextindex.
Vilken metod du väljer beror i slutändan på dina individuella förutsättningar; det viktigaste att komma ihåg är att för att förbättra prestandan måste du indexera korrekt för skiftlägesokänslig sökning.
1. Skifta din kolumn och din sträng identiskt.
Du kan tvinga alla dina data att vara samma sak genom att använda 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');
Om column_1
är inte indexerad på upper(column_1)
eller lower(column_1)
, när så är lämpligt, kan detta tvinga fram en genomsökning av hela tabellen. För att undvika detta kan du skapa ett funktionsbaserat index.
create index my_index on my_table ( lower(column_1) );
Om du använder LIKE måste du sammanfoga en %
runt strängen du söker efter.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
Denna SQL Fiddle visar vad som händer i alla dessa frågor. Notera Explain Plans, som anger när ett index används och när det inte används.
2. Använd reguljära uttryck.
Från Oracle 10g och framåt REGEXP_LIKE()
är tillgänglig. Du kan ange _match_parameter_ 'i'
, för att utföra skiftlägesokänslig sökning.
För att kunna använda detta som en jämlikhetsoperator måste du ange början och slutet av strängen, som betecknas med karat och dollartecknet.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
För att utföra motsvarande LIKE kan dessa tas bort.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
Var försiktig med detta eftersom din sträng kan innehålla tecken som kommer att tolkas annorlunda av motorn för reguljära uttryck.
Denna SQL-fiol visar samma exempelutdata förutom att använda REGEXP_LIKE().
3. Ändra det på sessionsnivå.
Parametern NLS_SORT styr sorteringssekvensen för beställning och de olika jämförelseoperatorerna, inklusive =
och som. Du kan ange en binär, skiftlägesokänslig sortering genom att ändra sessionen. Detta kommer att innebära att varje fråga som utförs i den sessionen kommer att utföra skiftlägesokänsliga parametrar.
alter session set nls_sort=BINARY_CI
Det finns massor av ytterligare information om språklig sortering och strängsökning om du vill ange ett annat språk eller göra en accentokänslig sökning med BINARY_AI.
Du måste också ändra parametern NLS_COMP; för att citera:
De exakta operatorerna och frågesatserna som följer parametern NLS_SORT beror på värdet på parametern NLS_COMP. Om en operator eller sats inte följer värdet NLS_SORT, enligt NLS_COMP, är den använda sorteringen BINÄR.
Standardvärdet för NLS_COMP är BINÄRT; men LINGUISTIC specificerar att Oracle bör vara uppmärksam på värdet av NLS_SORT:
Jämförelser för alla SQL-operationer i WHERE-satsen och i PL/SQLblock bör använda den språkliga sorteringen som anges i parametern NLS_SORT. För att förbättra prestandan kan du också definiera ett språkligt index för den kolumn som du vill ha språkliga jämförelser för.
Så återigen måste du ändra sessionen
alter session set nls_comp=LINGUISTIC
Som nämnts i dokumentationen kanske du vill skapa ett språkligt index för att förbättra prestandan
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));