Comparer les Chaînes en Oracle
J'ai besoin d'interroger une table de valeurs donnée une chaîne de caractères. La table est sensible à la casse, mais je veux faire un ToLower() dans la comparaison.
Supposons que j'ai une table classes avec les données suivantes.
class teacher
-----------------
Mat101 Smith
MAT101 Jones
mat101 Abram
ENG102 Smith
Ma requête doit être quelque chose comme
Select teacher From classes where lower(class) = 'math101'
Est-ce la meilleure façon de faire la comparaison?
Mise à jour
Je n'ai pas de contrôle sur la base de données ou les données. Je suis un accès en lecture seule à la consommation.
Vous devez vous connecter pour publier un commentaire.
Pas; il serait préférable d'améliorer les données: créer un IDENTIFIANT numérique qui représente ces apparemment dénué de sens, les variations de la classe (et probablement associé à une table de recherche pour obtenir l'ID). Utiliser l'ID de la colonne dans la clause where et vous devriez être frapper un indexée colonne numérique.
Si ce n'est pas une option, envisager une fonction d'index de base sur la partie inférieure(la classe).
Si ce n'est pas une option, et la question du "meilleur" est strictement par rapport à la performance, envisagez la dénormalisation et ajout d'une colonne qui contient plus faible(classe), probablement peuplé avec un seuil de déclenchement.
Si ce n'est pas une option, mettre à jour les données de sorte qu'il est tout en minuscules (et de prendre des mesures pour insérer/mettre à jour uniquement les minuscules données de la classe).
Si vous ne pouvez pas mettre à jour les données comme ça, alors la réponse est "peut-être".
Dans tous les cas, vous ne pouvez pas l'appeler le meilleur si vous n'avez pas encore testé l'indexation de la colonne.
Voici plus d'informations sur la Fonction Index (ce que Dave a fait référence ci-dessus):
Cette méthode exige que vous exécutez 10gr2 ou mieux.
Avant de modifier la session:
Si vous êtes en mesure de modifier votre session, vous pouvez effectuer les opérations suivantes:
Modifiant la session comme fait ci-dessus les causes de la base de données pour trier et comparer les majuscules et les minuscules version de la même lettre que l'équivalent des objets. Pour plus d'informations, veuillez consulter http://www.orafaq.com/node/91
HTH,
Gabe
L'inconvénient de la nature de la requête dont vous parlez, c'est qu'il ne peut pas utiliser un index sur la classe (comme une recherche d'index, qui est -- il pourrait encore être utilisé dans une rapide analyse complète de l'index).
Dans les versions modernes de Oracle, cependant, vous pouvez créer un index sur la partie INFÉRIEURE(la classe) qui peuvent ensuite être utilisés par cette requête.
Si les variantes (Mat101, MAT101, mat101) reportez-vous à la même chose, ils devraient avoir le même identifiant.
En fonction du volume de données, la fréquence des mises à jour, des requêtes, etc, vous pouvez envisager de reproduire les données dans une base de données que vous ne contrôle avec un nettoyage/de normalisation stade construit dans la réplication.
Alors que vous dites "je n'ai pas de contrôle sur la base de données", si vous pouvez vous interroger aura un impact sur la base de données. Quelqu'un a le contrôle de la base de données, et il peut être intéressant d'un courriel ou un appel téléphonique disant que, s'ils ajoutent un plus bas() de l'index de la colonne puis il permettra de réduire l'impact de vos requêtes sur la base de données.
Enfin, si les variantes sont assez simples, alors vous pourriez essayer
Depuis que vous avez ajouté que vous êtes un utilisateur en lecture seule de la base de données, le meilleur méthode est proche de ce que vous avez commencé avec:
Noter que j'ai ajouté plus BAS() pour le paramètre d'entrée, juste pour être sûr que c'est un bas-de-casse trop. Certains pourraient appeler ça "ceintures et bretelles" (aka devenus inutiles); j'appelle ça une bonne défensive de programmation.