Case insensitive Suche bei Oracle
Das default-Verhalten LIKE
und die anderen Vergleichsoperatoren =
etc ist case-sensitive.
Ist es möglich, machen Sie groß-und Kleinschreibung?
Freundliche Erinnerung, dass einige der Beispiel-Suche wird das Ergebnis in einem full table scan, selbst wenn es einen index für user_name.
Haben Sie sich überlegt mit
Nein, WIE funktioniert ok für mich
Haben Sie sich überlegt mit
REGEXP_LIKE(username,'me','i')
statt WIE?Nein, WIE funktioniert ok für mich
InformationsquelleAutor sergionni | 2011-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit 10gR2, Oracle ermöglicht die Feinabstimmung, die das Verhalten von string-Vergleiche durch die Einstellung der
NLS_COMP
undNLS_SORT
Sitzung Parameter:Können Sie auch groß-und Kleinschreibung Indizes:
Diese Informationen wurde aus Oracle case-insensitive Suche. Der Artikel erwähnt
REGEXP_LIKE
aber es scheint zu funktionieren mit der guten alten=
als gut.In älteren Versionen als 10gR2 es kann wirklich nicht getan werden und ist die übliche Vorgehensweise, wenn Sie nicht brauchen accent-insensitive suchen, ist zu einfach
UPPER()
die Spalte und die Suche nach Ausdruck.Beliebige
LIKE
Ausdrücke (z.B.WHERE foo LIKE '%abc%'
) sind schon langsam genug, wenn Sie nicht indiziert werden können, ich glaube nicht, dass es speziell im Zusammenhang mit der Fall-Empfindlichkeit.Ich habe sogar versucht mit = - operator. Gleiche Leistung verlangsamen.
Sie können auch festlegen, dass diese außerhalb von SQLPLUS, wie in der shell-Umgebung. Zum Beispiel in einem Perl-Skript mit
DBD::Oracle
schreiben Sie$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
vor dem Aufruf von ` DBI->connect`.hey macht mal nicht die
ALTER SESSION
nur ändern Sie Ihre lokalen Instanz von Korrektur und bedeutet es, wie Ihre aktuelle Sitzung, d.h. wenn ich schließen und wieder öffnen, es würde zurückgesetzt haben. Gibt es eine Möglichkeit, dass ich sehen kann, was die aktuellen Werte sind so, dass, wenn seine permanenten überall kann ich ändern zurück zu den ursprünglichen Einstellungen...InformationsquelleAutor Álvaro González
Es gibt im wesentlichen 3 Wege, um führen Sie eine case-insensitive Suche bei Oracle ohne Verwendung von Volltext-Indizes.
Letztlich, was Methode Sie wählen, ist abhängig von Ihren persönlichen Umständen; die wichtigste Sache zu erinnern ist, dass, um die Leistung zu verbessern, müssen Sie den index richtig für case-insensitive suchen.
1. Fall Ihre Spalte und Ihren string identisch.
Können Sie erzwingen, dass alle Ihre Daten an die gleiche Falle, indem Sie mit
UPPER()
oderLOWER()
:oder
Wenn
column_1
ist nicht indiziertupper(column_1)
oderlower(column_1)
gegebenenfalls kann dies erzwingen einen full table scan. Um dies zu vermeiden, können Sie erstellen eine function-based-index.Wenn Sie MÖGEN, dann haben Sie zum verketten einer
%
um die Zeichenfolge, die Sie suchen.Dieses SQL Fiddle zeigt, was passiert, in alle diese Fragen. Hinweis: die Explain-Pläne, die angeben, Wann ein index verwendet wird und Wann nicht.
2. Reguläre Ausdrücke verwenden.
Ab Oracle 10g ab
REGEXP_LIKE()
verfügbar ist. Sie können die _match_parameter_'i'
im Hinblick auf die Durchführung von groß-und Kleinschreibung in der Suche.Um als Gleichheits-operator ist, müssen Sie angeben Beginn und Ende der Zeichenfolge, die ist gekennzeichnet durch die Karat und die dollar-Zeichen.
Verwenden, um das äquivalent von, WIE diese entfernt werden kann.
Seien Sie vorsichtig mit dieser, wie Ihr string kann Zeichen enthalten, die unterschiedlich interpretiert werden, die von der engine für reguläre Ausdrücke.
Dieses SQL Fiddle zeigt das gleiche Beispiel, Ausgabe außer mit REGEXP_LIKE().
3. Ändern Sie auf der session-Ebene.
Den NLS_SORT parameter bestimmt die Sortierreihenfolge für die Bestellung und die verschiedenen Vergleichsoperatoren, einschließlich
=
- und WIE. Sie können auch eine binäre, der groß-und Kleinschreibung, Sortieren durch verändern der Sitzung. Dies bedeutet, dass jede Abfrage durchgeführt, in der die Sitzung durchführen wird case-insensitive-Parameter.Gibt es viele zusätzliche Informationen rund um die Linguistische Sortierung und string-Suche wenn Sie angeben möchten, eine andere Sprache, oder ein accent-insensitive-Suche mit BINARY_AI.
Müssen Sie auch ändern Sie die NLS_COMP parameter; Zitat:
Den default-Wert von NLS_COMP ist BINÄRE; aber SPRACHLICH gibt an, dass Oracle zahlen sollten, die Aufmerksamkeit auf den Wert der NLS_SORT:
So, wieder einmal müssen Sie ändern, um die session
Wie bereits in der Dokumentation, die Sie erstellen möchten, die eine sprachliche index um die Leistung zu verbessern
Darf ich Fragen, warum es anders zu tun
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
stattselect * from my_table where lower(column_1) LIKE lower('my_string%');
? Gibt es irgendeinen Vorteil?Ein Grund wäre, wenn Ihre Abfrage ist paramerterized (wahrscheinlich in den meisten Fällen), dann den aufrufenden code muss nicht immer verketten % auf die end @lopezvit.
Wenn es gibt einige Zeichen, die Durcheinander-bis das Ergebnis
regexp_like
, gibt es einen Ausweg aus solchen strings? Geben Sie ein Beispiel, wenn der string $, die Ausgabe wird nicht als das, was wir erwarten. //cc @Ben und andere, bitte teilen.`
das escape-Zeichen @bozzmob. Es sollte keinen Unterschied in der Ausgabe, wenn der string dem regulären Ausdruck in Betrieb ist, enthält eine$
dies kann nur dazu führen Sie Probleme, wenn Sie benötigen ein$
literal in deinem regulären Ausdruck. Wenn Sie haben ein bestimmtes Problem, ich würde eine andere Frage stellen, wenn dieser Kommentar - /Antwort-hat nicht geholfen.InformationsquelleAutor Ben
vielleicht können Sie versuchen, mit
Haben Sie sich Gedanken über
WHERE upper(user_name) LIKE UPPER('%ME%')
dann? 🙂Sie müssen die oberen Fall ist der Suchbegriff, wie gut!
na dann, warum nicht Sie
UPPER
auf die input-parameter auch?mit der
upper
- Funktion, verlieren Sie den index, haben Sie eine Idee, wie man die Suche über den index?InformationsquelleAutor V4Vendetta
Ab Oracle 12c R2 könnten Sie
COLLATE-operator
:Demo:
db<>fiddle-demo
InformationsquelleAutor Lukasz Szozda
%
's in der das erste argument das zweiteNLSSORT
werden nicht gedacht, Platzhalter, richtig? Diese Art von verwechseln.InformationsquelleAutor Clodoaldo Neto
können Sie etwas tun:
InformationsquelleAutor grep