Oracle
 sql >> Base de données >  >> RDS >> Oracle

Recherche insensible à la casse dans Oracle

Il existe 3 façons principales d'effectuer une recherche insensible à la casse dans Oracle sans utiliser d'index de texte intégral.

En fin de compte, la méthode que vous choisissez dépend de votre situation personnelle ; la principale chose à retenir est que pour améliorer les performances, vous devez indexer correctement pour une recherche insensible à la casse.

1. Cassez votre colonne et votre chaîne de manière identique.

Vous pouvez forcer toutes vos données à avoir la même casse en utilisant UPPER() ou LOWER() :

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

ou

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

Si column_1 n'est pas indexé sur upper(column_1) ou lower(column_1) , le cas échéant, cela peut forcer une analyse complète de la table. Pour éviter cela, vous pouvez créer un index basé sur les fonctions.

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

Si vous utilisez LIKE, vous devez concaténer un % autour de la chaîne que vous recherchez.

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

Ce SQL Fiddle montre ce qui se passe dans toutes ces requêtes. Notez les plans d'exécution, qui indiquent quand un index est utilisé et quand il ne l'est pas.

2. Utilisez des expressions régulières.

À partir d'Oracle 10g REGEXP_LIKE() est disponible. Vous pouvez spécifier le _match_parameter_ 'i' , afin d'effectuer une recherche insensible à la casse.

Pour l'utiliser comme opérateur d'égalité, vous devez spécifier le début et la fin de la chaîne, qui est indiquée par le carat et le signe dollar.

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

Afin d'effectuer l'équivalent de LIKE, ceux-ci peuvent être supprimés.

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

Soyez prudent avec cela car votre chaîne peut contenir des caractères qui seront interprétés différemment par le moteur d'expressions régulières.

Ce SQL Fiddle vous montre le même exemple de sortie, sauf en utilisant REGEXP_LIKE().

3. Modifiez-le au niveau de la session.

Le paramètre NLS_SORT régit la séquence de classement pour le classement et les différents opérateurs de comparaison, y compris = et J'AIME. Vous pouvez spécifier un tri binaire, insensible à la casse, en modifiant la session. Cela signifie que chaque requête effectuée dans cette session exécutera des paramètres insensibles à la casse.

alter session set nls_sort=BINARY_CI

Il existe de nombreuses informations supplémentaires sur le tri linguistique et la recherche de chaînes si vous souhaitez spécifier une langue différente ou effectuer une recherche insensible aux accents à l'aide de BINARY_AI.

Vous devrez également modifier le paramètre NLS_COMP ; pour citer :

Les opérateurs exacts et les clauses de requête qui obéissent au paramètre NLS_SORT dépendent de la valeur du paramètre NLS_COMP. Si un opérateur ou une clause n'obéit pas à la valeur NLS_SORT, telle que déterminée par NLS_COMP, le classement utilisé est BINARY.

La valeur par défaut de NLS_COMP est BINARY; mais, LINGUISTIC précise qu'Oracle doit prêter attention à la valeur de NLS_SORT :

Les comparaisons pour toutes les opérations SQL dans la clause WHERE et dans les blocs PL/SQL doivent utiliser le tri linguistique spécifié dans le paramètre NLS_SORT. Pour améliorer les performances, vous pouvez également définir un index linguistique sur la colonne pour laquelle vous souhaitez des comparaisons linguistiques.

Donc, encore une fois, vous devez modifier la session

alter session set nls_comp=LINGUISTIC

Comme indiqué dans la documentation, vous souhaiterez peut-être créer un index linguistique pour améliorer les performances

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