Das Standardverhalten von LIKE
und den anderen Vergleichsoperatoren =
usw. unterscheidet zwischen Groß- und Kleinschreibung.
Ist es möglich, sie unabhängig von Groß- und Kleinschreibung zu machen?
sql
oracle
case-sensitive
case-insensitive
sql-like
sergionni
quelle
quelle
REGEXP_LIKE(username,'me','i')
anstelle von LIKE zu verwenden?Antworten:
Seit 10gR2 ermöglicht Oracle die Feinabstimmung des Verhaltens von Zeichenfolgenvergleichen durch Festlegen der Parameter
NLS_COMP
und und derNLS_SORT
Sitzung:Sie können auch Indizes erstellen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird:
Diese Informationen stammen aus Oracle-Suchanfragen ohne Berücksichtigung der Groß- und Kleinschreibung . Der Artikel erwähnt,
REGEXP_LIKE
aber es scheint auch mit guten alten zu funktionieren=
.In Versionen älter als 10gR2 kann es nicht wirklich und die übliche Vorgehensweise durchgeführt werden, wenn Sie nicht brauchen Akzent unempfindlichen ist die Suche, um nur
UPPER()
sowohl die Säule und der Suchausdruck.quelle
LIKE
Ausdrücke (z. B.WHERE foo LIKE '%abc%'
) sind bereits langsam genug, wenn sie nicht indiziert werden können. Ich glaube nicht, dass sie speziell mit der Groß- und Kleinschreibung zusammenhängen.DBD::Oracle
schreiben,$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
bevor Sie `DBI-> connect` aufrufen.ALTER SESSION
nur die lokale Instanz der Korrektur und bedeutet dies wie Ihre aktuelle Sitzung, dh wenn ich sie schließe und wieder öffne, würde sie zurückgesetzt. Gibt es eine Möglichkeit, wie ich sehen kann, was die aktuellen Werte sind, so dass ich, wenn es überall bestehenEs gibt drei Möglichkeiten, in Oracle eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung ohne Verwendung von Volltextindizes durchzuführen.
Welche Methode Sie wählen, hängt letztendlich von Ihren individuellen Umständen ab. Beachten Sie vor allem, dass Sie zur Verbesserung der Leistung eine korrekte Indizierung für die Suche ohne Berücksichtigung der Groß- und Kleinschreibung vornehmen müssen.
1. Groß- und Kleinschreibung Ihrer Spalte und Ihrer Zeichenfolge.
Sie können erzwingen, dass alle Ihre Daten der gleiche Fall sind, indem Sie
UPPER()
oder verwendenLOWER()
:oder
Wenn dies
column_1
nicht indiziert istupper(column_1)
oderlower(column_1)
gegebenenfalls, kann dies einen vollständigen Tabellenscan erzwingen. Um dies zu vermeiden, können Sie einen funktionsbasierten Index erstellen .Wenn Sie LIKE verwenden, müssen Sie eine
%
Zeichenfolge um die gesuchte Zeichenfolge verketten .Diese SQL-Geige zeigt, was in all diesen Abfragen passiert. Beachten Sie die Erklärungspläne, die angeben, wann ein Index verwendet wird und wann nicht.
2. Verwenden Sie reguläre Ausdrücke.
Ab Oracle 10g
REGEXP_LIKE()
ist verfügbar. Sie können den _match_parameter_ angeben'i'
, um eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen.Um dies als Gleichheitsoperator zu verwenden, müssen Sie den Anfang und das Ende der Zeichenfolge angeben, die durch das Karat und das Dollarzeichen gekennzeichnet sind.
Um das Äquivalent von LIKE auszuführen, können diese entfernt werden.
Seien Sie vorsichtig damit, da Ihre Zeichenfolge möglicherweise Zeichen enthält, die von der Engine für reguläre Ausdrücke unterschiedlich interpretiert werden.
Diese SQL-Geige zeigt Ihnen dieselbe Beispielausgabe, außer dass REGEXP_LIKE () verwendet wird.
3. Ändern Sie es auf Sitzungsebene.
Der Parameter NLS_SORT regelt die Sortierreihenfolge für die Bestellung und die verschiedenen Vergleichsoperatoren, einschließlich
=
und LIKE. Sie können eine binäre Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung angeben, indem Sie die Sitzung ändern. Dies bedeutet, dass jede in dieser Sitzung durchgeführte Abfrage Parameter ohne Berücksichtigung der Groß- und Kleinschreibung ausführt.Es gibt viele zusätzliche Informationen zur sprachlichen Sortierung und Zeichenfolgensuche, wenn Sie eine andere Sprache angeben oder eine akzentunempfindliche Suche mit BINARY_AI durchführen möchten.
Sie müssen auch den Parameter NLS_COMP ändern . zitieren:
Der Standardwert von NLS_COMP ist BINARY. LINGUISTIC gibt jedoch an, dass Oracle auf den Wert von NLS_SORT achten soll:
Sie müssen also die Sitzung erneut ändern
Wie in der Dokumentation erwähnt, möchten Sie möglicherweise einen Sprachindex erstellen , um die Leistung zu verbessern
quelle
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 einen Vorteil?regexp_like
, gibt es eine Möglichkeit, solchen Zeichenfolgen zu entkommen? Wenn der String beispielsweise $ enthält, entspricht die Ausgabe nicht den Erwartungen. // cc @Ben und andere bitte teilen.`
ist das Escapezeichen @bozzmob. Es sollte keinen Unterschied in der Ausgabe geben, wenn die Zeichenfolge, mit der der reguläre Ausdruck arbeitet, a enthält$
. Dies kann nur dann zu Problemen führen, wenn Sie ein$
Literal in Ihrem regulären Ausdruck benötigen . Wenn Sie ein bestimmtes Problem haben, würde ich eine andere Frage stellen, wenn dieser Kommentar / diese Antwort nicht geholfen hat.Vielleicht kannst du es versuchen
quelle
WHERE upper(user_name) LIKE UPPER('%ME%')
? :)UPPER
den Eingabeparameter?upper
Funktion, dass Sie den Index verlieren, haben Sie eine Idee, wie Sie mit dem Index suchen können?Ab Oracle 12c R2 können Sie Folgendes verwenden
COLLATE operator
:Demo:
db <> Geigen-Demo
quelle
quelle
%
im ersten bis zweiten ArgumentNLSSORT
sind keine Platzhalter, oder? Sie verwirren irgendwie.Sie können so etwas tun:
quelle