Vergleichen Sie Strings in Oracle
Brauche ich zur Abfrage einer Tabelle für die Werte in einem gegebenen string. Die Tabelle case-Sensitiv ist, aber ich will ein ToLower() im Vergleich.
Angenommen ich habe a-Klassen-Tabelle mit den folgenden Daten.
class teacher
-----------------
Mat101 Smith
MAT101 Jones
mat101 Abram
ENG102 Smith
Meine Abfrage sollte so etwas wie
Select teacher From classes where lower(class) = 'math101'
Ist dies der beste Weg zu tun, der Vergleich?
Update
Ich habe keine Kontrolle über die Datenbank oder die Daten. Ich bin eine nur-lese-Verbraucher.
InformationsquelleAutor | 2008-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht; es wäre besser, zur Verbesserung der Daten: erstellen Sie eine numerische ID, repräsentiert diese scheinbar bedeutungslose Varianten der Klasse (und wahrscheinlich einen assoziierten lookup-Tabelle, um die ID). Verwenden Sie die ID-Spalte in der where-Klausel und Sie schlagen sollten eine indizierte numerische Spalte.
Wenn das nicht eine option, sollten Sie einen Funktions-basierten index auf den unteren(Klasse).
Wenn das nicht eine option, und die Frage nach der "besten" ist streng relativ zur Leistung, betrachten denormalizing und das hinzufügen einer Spalte mit niedriger(Klasse), wahrscheinlich gefüllt mit einem trigger.
Wenn das nicht eine option, Aktualisierung der Daten, so dass es alle Kleinbuchstaben (und Maßnahmen ergreifen, um die insert - /update-nur Kleinbuchstaben-Klasse Daten).
Wenn Sie nicht aktualisieren Sie die Daten, wie Sie, dann ist die Antwort "vielleicht".
In jedem Fall, Sie können nicht nennen es am besten, wenn Sie noch nicht getestet, die Indizierung der Spalte.
InformationsquelleAutor Alkini
Hier finden Sie weitere Informationen über die Funktion-basierte Indizes (was Dave bezog sich auf oben):
InformationsquelleAutor Eddie Awad
Diese Methode erfordert, dass Sie laufen 10gr2 oder besser.
Bevor die änderung-Sitzung:
Wenn Sie sind in der Lage zu ändern, Ihre Sitzung können Sie Folgendes tun:
Verändern Sie die Sitzung wie oben bewirkt, dass die Datenbank Sortieren und vergleichen die groß-und Kleinschreibung version der gleichen Buchstaben als gleichwertige Objekte. Für weitere Informationen, bitte sehen http://www.orafaq.com/node/91
HTH,
Gabe
Nur wenn der index erstellt wurde, mit, dass NLSSORT die Einstellung der download.oracle.com/docs/cd/B19306_01/server.102/b14225/...
InformationsquelleAutor Gabe
Der Nachteil an der Art von Abfrage, die Sie sprechen, ist, dass es nicht verwenden können, einen index auf eine Klasse (wie ein index-lookup, das ist -- es könnte noch genutzt werden, in ein fast vollständiger scan des index).
In modernen Versionen von Oracle, obwohl, können Sie einen index erstellen, der auf der UNTEREN(Klasse), die dann verwendet werden können, die von dieser Abfrage.
InformationsquelleAutor Dave Costa
Wenn die Varianten (Mat101, MAT101, mat101) beziehen sich auf die gleiche Sache, die Sie haben sollten, den gleichen Bezeichner.
Abhängig von der Menge der Daten, Häufigkeit der updates, Abfragen etc, können Sie berücksichtigen die Replikation der Daten in einer Datenbank, die Sie tun Kontrolle mit einem Reinigungs - /Normung Bühne gebaut, die in die Replikation.
Während Sie sagen, "ich habe keine Kontrolle über die Datenbank", wenn Sie Abfragen können, haben Sie eine Auswirkung in der Datenbank. Jemand hat die Kontrolle der Datenbank, und es kann sich lohnen, eine E-Mail/Anruf zu sagen, dass, wenn Sie hinzufügen, eine untere() der index auf die Spalte, dann wird es reduzieren Sie die Auswirkungen Ihrer Abfragen auf die Datenbank.
Schließlich, wenn die Varianten sind einfach genug, dann könnten Sie versuchen,
InformationsquelleAutor Gary Myers
Da Sie Hinzugefügt, dass Sie eine nur-Lesen-Benutzer von der Datenbank, die besten Methode ist nah an, was Sie mit gestartet:
Beachten Sie, dass ich fügte hinzu, UNTEREN (), um die input-parameter, nur um sicher zu sein, dass die lower-case zu. Einige nennen könnte, dass "Gürtel und Hosenträger" (aka redudant); ich nenne es eine gute defensive Programmierung.
InformationsquelleAutor Stew S