Oracle
 sql >> Database >  >> RDS >> Oracle

Ricerca senza distinzione tra maiuscole e minuscole in Oracle

Esistono 3 modi principali per eseguire una ricerca senza distinzione tra maiuscole e minuscole in Oracle senza utilizzare indici full-text.

In definitiva, quale metodo scegli dipende dalle tue circostanze individuali; la cosa principale da ricordare è che per migliorare le prestazioni è necessario indicizzare correttamente per la ricerca senza distinzione tra maiuscole e minuscole.

1. Metti in maiuscolo la colonna e la stringa in modo identico.

Puoi forzare che tutti i tuoi dati siano nello stesso caso utilizzando UPPER() o LOWER() :

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

o

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

Se column_1 non è indicizzato su upper(column_1) o lower(column_1) , a seconda dei casi, ciò potrebbe forzare una scansione completa della tabella. Per evitare ciò puoi creare un indice basato su funzioni.

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

Se stai usando LIKE, devi concatenare un % attorno alla stringa che stai cercando.

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

Questo SQL Fiddle mostra cosa succede in tutte queste query. Nota gli Explain Plans, che indicano quando un indice viene utilizzato e quando non lo è.

2. Usa le espressioni regolari.

Da Oracle 10g in poi REGEXP_LIKE() è disponibile. Puoi specificare il _match_parameter_ 'i' , per eseguire ricerche senza distinzione tra maiuscole e minuscole.

Per utilizzarlo come operatore di uguaglianza, devi specificare l'inizio e la fine della stringa, che è indicata dal carato e dal simbolo del dollaro.

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

Per eseguire l'equivalente di LIKE, questi possono essere rimossi.

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

Fai attenzione perché la tua stringa potrebbe contenere caratteri che verranno interpretati in modo diverso dal motore delle espressioni regolari.

Questo SQL Fiddle mostra lo stesso output di esempio, tranne l'utilizzo di REGEXP_LIKE().

3. Modificalo a livello di sessione.

Il parametro NLS_SORT governa la sequenza di confronto per l'ordinazione e i vari operatori di confronto, incluso = e come. È possibile specificare un ordinamento binario, senza distinzione tra maiuscole e minuscole, modificando la sessione. Ciò significa che ogni query eseguita in quella sessione eseguirà parametri senza distinzione tra maiuscole e minuscole.

alter session set nls_sort=BINARY_CI

Sono disponibili molte informazioni aggiuntive sull'ordinamento linguistico e sulla ricerca di stringhe se desideri specificare una lingua diversa o eseguire una ricerca senza accento utilizzando BINARY_AI.

Sarà inoltre necessario modificare il parametro NLS_COMP; per citare:

Gli operatori esatti e le clausole di query che obbediscono al parametro NLS_SORT dipendono dal valore del parametro NLS_COMP. Se un operatore o una clausola non obbedisce al valore NLS_SORT, come determinato da NLS_COMP, il confronto utilizzato è BINARY.

Il valore predefinito di NLS_COMP è BINARY; ma, LINGUISTIC specifica che Oracle dovrebbe prestare attenzione al valore di NLS_SORT:

I confronti per tutte le operazioni SQL nella clausola WHERE e nei blocchi PL/SQL devono utilizzare l'ordinamento linguistico specificato nel parametro NLS_SORT. Per migliorare le prestazioni, puoi anche definire un indice linguistico sulla colonna per la quale desideri confronti linguistici.

Quindi, ancora una volta, devi modificare la sessione

alter session set nls_comp=LINGUISTIC

Come indicato nella documentazione, potresti voler creare un indice linguistico per migliorare le prestazioni

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