Es 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 verwenden LOWER()
:
select * from my_table where upper(column_1) = upper('my_string');
oder
select * from my_table where lower(column_1) = lower('my_string');
Wenn dies column_1
nicht indiziert ist upper(column_1)
oder lower(column_1)
gegebenenfalls, kann dies einen vollständigen Tabellenscan erzwingen. Um dies zu vermeiden, können Sie einen funktionsbasierten Index erstellen .
create index my_index on my_table ( lower(column_1) );
Wenn Sie LIKE verwenden, müssen Sie eine %
Zeichenfolge um die gesuchte Zeichenfolge verketten .
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
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.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
Um das Äquivalent von LIKE auszuführen, können diese entfernt werden.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
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.
alter session set nls_sort=BINARY_CI
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:
Die genauen Operatoren und Abfrageklauseln, die dem Parameter NLS_SORT entsprechen, hängen vom Wert des Parameters NLS_COMP ab. Wenn ein Operator oder eine Klausel den von NLS_COMP festgelegten NLS_SORT-Wert nicht befolgt, lautet die verwendete Sortierung BINARY.
Der Standardwert von NLS_COMP ist BINARY. LINGUISTIC gibt jedoch an, dass Oracle auf den Wert von NLS_SORT achten soll:
Vergleiche für alle SQL-Operationen in der WHERE-Klausel und in PL / SQL-Blöcken sollten die im Parameter NLS_SORT angegebene sprachliche Sortierung verwenden. Um die Leistung zu verbessern, können Sie auch einen Sprachindex für die Spalte definieren, für die Sie Sprachvergleiche wünschen.
Sie müssen also die Sitzung erneut ändern
alter session set nls_comp=LINGUISTIC
Wie in der Dokumentation erwähnt, möchten Sie möglicherweise einen Sprachindex erstellen , um die Leistung zu verbessern
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));