Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Suche ohne Berücksichtigung der Groß-/Kleinschreibung in Oracle

Es gibt drei Hauptwege, um eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung in Oracle durchzuführen, ohne Volltextindizes zu verwenden.

Für welche Methode Sie sich letztendlich entscheiden, hängt von Ihren individuellen Umständen ab; Das Wichtigste, woran Sie denken sollten, ist, dass Sie zur Verbesserung der Leistung für die Suche ohne Berücksichtigung der Groß-/Kleinschreibung korrekt indizieren müssen.

1. Schreibe deine Spalte und deinen String identisch.

Mit UPPER() können Sie für alle Ihre Daten die gleiche Groß-/Kleinschreibung erzwingen oder 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 column_1 ist nicht auf upper(column_1) indiziert oder lower(column_1) , kann dies gegebenenfalls 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 ein % verketten um die Zeichenfolge herum, nach der Sie suchen.

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 Explain-Plä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_ 'i' angeben , um eine Suche ohne Berücksichtigung der Groß-/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 dabei vorsichtig, da Ihre Zeichenfolge Zeichen enthalten kann, die von der Engine für reguläre Ausdrücke anders interpretiert werden.

Diese SQL-Fiddle zeigt Ihnen dieselbe Beispielausgabe, außer dass REGEXP_LIKE() verwendet wird.

3. Ändern Sie es auf Sitzungsebene.

Der Parameter NLS_SORT regelt die Kollationsreihenfolge für die Sortierung und die verschiedenen Vergleichsoperatoren, einschließlich = und wie. Sie können eine binäre Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung angeben, indem Sie die Sitzung ändern. Dies bedeutet, dass jede in dieser Sitzung durchgeführte Abfrage Parameter ohne Berücksichtigung der Groß-/Kleinschreibung ausführt.

alter session set nls_sort=BINARY_CI

Es gibt viele zusätzliche Informationen zur linguistischen Sortierung und Zeichenfolgensuche, wenn Sie eine andere Sprache angeben oder eine akzentunabhängige Suche mit BINARY_AI durchführen möchten.

Sie müssen auch den NLS_COMP-Parameter ändern; Zitat:

Die genauen Operatoren und Abfrageklauseln, die dem Parameter NLS_SORT gehorchen, hängen vom Wert des Parameters NLS_COMP ab. Wenn eine Operator-Orclause nicht dem NLS_SORT-Wert entspricht, wie von NLS_COMP bestimmt, ist die verwendete Sortierung BINARY.

Der Standardwert von NLS_COMP ist BINARY; aber LINGUISTIC gibt an, dass Oracle auf den Wert von NLS_SORT:

achten sollte

Vergleiche für alle SQL-Operationen in der WHERE-Klausel und in PL/SQL-Blöcken sollten die im NLS_SORT-Parameter angegebene linguistische Sortierung verwenden. Um die Leistung zu verbessern, können Sie auch einen linguistischen Index für die Spalte definieren, für die Sie linguistische Vergleiche wünschen.

Sie müssen also noch einmal die Sitzung ändern

alter session set nls_comp=LINGUISTIC

Wie in der Dokumentation erwähnt, möchten Sie möglicherweise einen linguistischen Index erstellen, um die Leistung zu verbessern

create index my_linguistc_index on my_table 
   (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));