72 votes

Oracle DB : Comment écrire une requête en ignorant la casse ?

Comme je l'ai écrit dans le titre, j'ai une requête SQL, exécutée sur une base de données Oracle, par exemple :

SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'

Si je souhaite que la requête renvoie soit "IGNORECASE", "ignorecase" ou une combinaison des deux, comment faire ?

0 votes

134voto

Hooloovoo Points 1000
Select * from table where upper(table.name) like upper('IgNoreCaSe');

Vous pouvez également remplacer le mot "supérieur" par "inférieur".

1 votes

Je ferais attention avec le LIKE . Cela peut entraîner des effets secondaires indésirables, par exemple lorsque la chaîne de caractères contient un caractère spécial tel que % . Utilisation de upper(table.name) = upper('iGnOrEcASe') devrait être plus sûr.

41voto

devio Points 22981

Utilisez les instructions ALTER SESSION pour que la comparaison soit insensible à la casse :

alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;

Si vous utilisez toujours la version 10gR2, utilisez les déclarations ci-dessous. Voir cette FAQ pour plus de détails .

alter session set NLS_COMP=ANSI;
alter session set NLS_SORT=BINARY_CI;

1 votes

Si zeroDevisible est sur 10gR2 ou plus, c'est beaucoup mieux que les index basés sur les fonctions, car cela couvrira les 12 champs de la requête sans la surcharge de tous ces index. un problème potentiel est que l'utilisateur doit modifier la session à chaque fois.

3 votes

Je ne suis pas sûr de la surcharge dont vous parlez. Si vous créez un index "normal", puis modifiez les paramètres NLS_COMP et NLS_SORT, Oracle ne sera plus en mesure d'utiliser l'index pour trouver les données en question. Il faut donc créer des index spécifiques au paramètre NLS pour toutes les colonnes appropriées. Il ne me semble pas évident que cela génère plus ou moins de frais généraux que les index basés sur les fonctions (FBI). Évidemment, si vous voulez que toutes les requêtes soient insensibles à la casse, il n'est pas nécessaire de maintenir un index sur une colonne et un FBI sur UPPER(column) (ou de maintenir des index pour différents paramètres NLS).

1 votes

@devio Dosent travail pour moi dans la version : 12 c s'il vous plaît mettre à jour votre réponse

29voto

joe Points 7966

Vous pouvez utiliser la fonction inférieure ou supérieure des deux côtés de la condition "where".

0 votes

Merci pour cette réponse rapide. Je me demande, parce que ma requête sélectionne environ 12 champs à partir d'une table vraiment énorme, donc j'aurais besoin d'environ 20 utilisations de la fonction supérieure - cela ne serait-il pas une perte de performance ?

0 votes

Si vous connaissez les mots exacts que vous voulez vérifier, vous pouvez utiliser une instruction IN (SELECT * FROM TABLE WHERE UPPER(NAME) IN (UPPER('Name1'), UPPER('Name2')) ; ou si les noms commencent tous de la même manière, vous pouvez le faire avec un caractère générique (SELECT * FROM TABLE WHERE UPPER(NAME) LIKE UPPER('Search%') ;)

6 votes

L'utilisation de fonctions telles que upper n'est jamais une perte de performance si vous parlez du temps nécessaire à Oracle pour effectuer l'opération - le temps nécessaire au processeur pour effectuer la conversion est insignifiant comparé au temps nécessaire pour charger les pages de données depuis le cache, sans parler de leur récupération depuis le disque. Cependant, l'utilisation de lower ou upper empêchera votre requête d'utiliser les index sur ces colonnes, à moins que vous n'ayez créé des index qui utilisent ces fonctions. Mais la fonction LIKE peut également empêcher l'utilisation des index, en particulier si le premier caractère de l'expression est un caractère générique.

17voto

kMAP Points 41

Vous pouvez également utiliser des expressions régulières :

SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');

8voto

akf Points 23518

Vous pouvez utiliser la fonction upper() dans votre requête et, pour améliorer les performances, vous pouvez utiliser un index basé sur la fonction.

 CREATE INDEX upper_index_name ON table(upper(name))

0 votes

Bonne suggestion ! Pourriez-vous également fournir un exemple sur la façon d'effectuer une recherche à l'aide de l'index ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X