sql >> Database >  >> RDS >> Oracle

Hoofdletterongevoelig zoeken in Oracle

Er zijn 3 manieren om hoofdletterongevoelig te zoeken in Oracle zonder gebruik te maken van full-text indexen.

Welke methode u uiteindelijk kiest, hangt af van uw individuele omstandigheden; het belangrijkste om te onthouden is dat om de prestaties te verbeteren, u correct moet indexeren voor hoofdletterongevoelig zoeken.

1. Schrijf uw kolom en uw tekenreeks op dezelfde manier in.

U kunt al uw gegevens dwingen hetzelfde te zijn door UPPER() . te gebruiken of LOWER() :

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

of

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

Als column_1 is niet geïndexeerd op upper(column_1) of lower(column_1) , indien van toepassing, kan dit een volledige tabelscan forceren. Om dit te voorkomen, kunt u een op functies gebaseerde index maken.

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

Als je LIKE gebruikt, moet je een % . samenvoegen rond de string die u zoekt.

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

Deze SQL Fiddle laat zien wat er in al deze queries gebeurt. Let op de Explain Plans, die aangeven wanneer een index wordt gebruikt en wanneer niet.

2. Gebruik reguliere expressies.

Vanaf Oracle 10g REGEXP_LIKE() is beschikbaar. U kunt de _match_parameter_ 'i' . specificeren , om hoofdletterongevoelig te zoeken.

Om dit als een gelijkheidsoperator te gebruiken, moet u het begin en einde van de tekenreeks specificeren, die wordt aangegeven door het karaat en het dollarteken.

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

Om het equivalent van LIKE uit te voeren, kunnen deze worden verwijderd.

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

Wees hier voorzichtig mee, want uw tekenreeks kan tekens bevatten die door de engine voor reguliere expressies anders worden geïnterpreteerd.

Deze SQL Fiddle toont u dezelfde voorbeelduitvoer, behalve het gebruik van REGEXP_LIKE().

3. Wijzig het op sessieniveau.

De parameter NLS_SORT regelt de sorteervolgorde voor het bestellen en de verschillende vergelijkingsoperatoren, waaronder = en zoals. U kunt een binaire, hoofdletterongevoelige sortering specificeren door de sessie te wijzigen. Dit betekent dat elke query die in die sessie wordt uitgevoerd, hoofdletterongevoelige parameters zal uitvoeren.

alter session set nls_sort=BINARY_CI

Er is veel aanvullende informatie over taalkundige sortering en zoeken op tekenreeksen als u een andere taal wilt specificeren of een accentongevoelige zoekopdracht wilt uitvoeren met BINARY_AI.

U moet ook de parameter NLS_COMP wijzigen; om te citeren:

De exacte operators en query-clausules die voldoen aan de parameter NLS_SORT zijn afhankelijk van de waarde van de parameter NLS_COMP. Als een operator of clausule niet voldoet aan de NLS_SORT-waarde, zoals bepaald door NLS_COMP, is de gebruikte sortering BINARY.

De standaardwaarde van NLS_COMP is BINARY; maar LINGUISTIC specificeert dat Oracle aandacht moet besteden aan de waarde van NLS_SORT:

Vergelijkingen voor alle SQL-bewerkingen in de WHERE-clausule en in PL/SQL-blokken moeten de taalkundige sortering gebruiken die is opgegeven in de parameter NLS_SORT. Om de prestaties te verbeteren, kunt u ook de taalindex definiëren voor de kolom waarvoor u taalkundige vergelijkingen wilt.

Dus nogmaals, je moet de sessie wijzigen

alter session set nls_comp=LINGUISTIC

Zoals vermeld in de documentatie wilt u misschien een taalkundige index maken om de prestaties te verbeteren

create index my_linguistc_index on my_table 
   (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));


  1. MSSQL Reguliere expressie

  2. Hoe kan ik door alle rijen van een tabel lopen? (MySQL)

  3. Hoe ON CONFLICT werkt in SQLite

  4. SQL:in clausule in opgeslagen procedure:hoe waarden doorgeven