Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Sprachelemente » Suchbedingungen

 

Die Suchbedingungen LIKE, REGEXP und SIMILAR TO

Die Suchbedingungen REGEXP, LIKE und SIMILAR TO sind einander insofern ähnlich, als sie die Übereinstimmung eines Musters mit einer Zeichenfolge suchen. Außerdem versuchen alle drei, die Übereinstimmung mit einer kompletten Zeichenfolge zu finden, nicht mit einer Teilzeichenfolge in der Zeichenfolge.

Die Basissyntax ist bei allen drei Suchbedingungen ähnlich:

Ausdruck Suchbedingung Muster
Unterschiede in der Suchmusterdefinition von LIKE, REGEXP und SIMILAR TO

Die Suchbedingungen REGEXP, LIKE und SIMILAR TO unterscheiden sich in der Art, wie Sie das Suchmuster definieren:

  • REGEXP unterstützt eine Obermenge der Syntax von regulären Ausdrücken, die von SIMILAR TO unterstützt wird. Zur Kompatibilität mit anderen Produkten unterstützt die Suchbedingung REGEXP darüber hinaus einige Syntaxerweiterungen. REGEXP und SIMILAR TO haben außerdem unterschiedliche Escape-Zeichen. Das REGEXP-Verhalten ist stark auf Perl 5 abgestimmt (außer dort, wo die Perl-Syntax und Operatoren nicht unterstützt werden).

  • Die LIKE-Syntax für Muster ist einfach und unterstützt eine kleine Menge von Wildcard-Zeichen, nicht aber die komplette Syntax für reguläre Ausdrücke.

  • Die Syntax von SIMILAR TO für Muster ermöglicht eine geradlinigie Suche nach Musterübereinstimmungen mit regulären Ausdrücken, die im ANSI/ISO SQL-Standard definiert sind.

Unterschiede im Zeichenvergleich von LIKE, REGEXP und SIMILAR TO

Das Verhalten von REGEXP bei Vergleichen unterscheidet sich von LIKE und SIMILAR TO. Für REGEXP-Vergleiche benutzt der Datenbankserver Codepunktwerte im Zeichensatz der Datenbank, um Suchmuster zu vergleichen. Dies entspricht anderen Implementierungen von regulären Ausdrücken wie Perl.

Bei LIKE und SIMILAR TO benutzt der Datenbankserver die Äquivalenz und die Sortierreihenfolge in der Datenbankkollatierung, um Suchmuster zu vergleichen. Dies entspricht der Art, wie die Datenbank Vergleichsoperatoren wie > und = handhabt.

Der Unterschied der Zeichenvergleichsmethoden bedeutet, dass Ergebnisse des Suchmusters und der Bereichsauswertung für REGEXP und LIKE/SIMILAR ebenfalls voneinander abweichen.

  • Unterschiede bei der Suche nach Übereinstimmungen   Da REGEXP Codepunktwerte verwendet, wird ein Literal in einem Suchmuster nur als übereinstimmend ausgewertet, wenn es ein identisches Zeichen ist. Die Suche nach Übereinstimmungen wird daher bei REGEXP durch Besonderheiten, wie der Berücksichtigung von Groß-, Klein und Akzentschreibung einer Datenbankkollatierung, nicht beeinflusst. Beispiel: Für 'a' wird daher nie 'A' als Übereinstimmung gefunden.

    Da LIKE und SIMILAR TO die Datenbankkollatierung verwenden, werden die Ergebnisse durch die Berücksichtigung der Groß-, Klein- und Akzentschreibung beeinflusst. Beispiel: Wenn die Datenbankkollatierung die Groß-, Klein und Akzentschreibung nicht berücksichtigt, wird diese auch bei Suchvorgängen nicht berücksichtigt. 'A' kann daher für das Suchmuster 'a' gefunden werden.

  • Unterschiede bei der Auswertung von Bereichen   Da REGEXP Codepunkte für die Auswertung von Bereichen benutzt, gilt ein Zeichen als im Bereich enthalten, wenn sein Codepunktwert dem Start- oder Endzeichen des Bereichs entspricht bzw. dazwischen liegt. Beispiel: Der Vergleich x REGEXP '[A-C]' für das einzelne Zeichen x entspricht CAST(x AS BINARY) >= CAST(A AS BINARY) AND CAST(x AS BINARY) <= CAST(C AS BINARY) .

    Da LIKE und SIMILAR TO die Sortierreihenfolge der Kollatierung für die Auswertung des Bereichs verwenden, wird ein Zeichen als im Bereich enthalten angesehen, wenn seine Position in der Kollatierung dem Start- oder Endzeichen des Bereichs entspricht oder dazwischen liegt. Beispiel: Der Vergleich x SIMILAR TO '[A-C]' (wobei gilt: x ist ein einzelnes Zeichen) entspricht x >= A AND x <= C, und die Vergleichsoperatoren werden unter Verwendung der Sortierreihenfolge der Kollatierung ausgewertet.

    Die folgende Tabelle zeigt die Menge der Zeichen, die im Bereich '[A-C]' enthalten sind, wenn er durch LIKE, SIMILAR TO und REGEXP ausgewertet wird. Beide Datenbanken benutzen die Kollatierung 1252LATIN1, aber die erste Datenbank berücksichtigt die Groß- und Kleinschreibung nicht, die zweite hingegen schon.

    LIKE/SIMILAR TO '[A-C]' REGEXP '[A-C]'
    demo.db (keine Berücksichtigung von Groß- und Kleinschreibung) A,B,C,a,b,c,ª,À,Á,Â,Ã,Ä,Å,Æ,Ç,à,á,â,ã,ä,å,æ,ç A, B, C
    charsensitive.db (Berücksichtigung von Groß- und Kleinschreibung) A,B,C,b,c,À,Á,Â,Ã,Ä,Å,Æ,Ç,ç A, B, C

    In den Ergebnissen ist Folgendes zu beobachten:

    • LIKE und SIMILAR TO enthalten Akzentbuchstaben im Bereich.

    • LIKE und SIMILAR TO enthalten unterschiedliche Zeichen je nach der Berücksichtigung der Groß- und Kleinschreibung durch die Datenbank. Insbesondere enthalten sie Kleinbuchstaben des Bereichs, die Sie möglicherweise beim Durchsuchen einer Datenbank, die die Groß- und Kleinschreibung berücksichtigt, nicht erwartet haben.

      In einer Datenbank, die die Groß- und Kleinschreibung nicht berücksichtigt, sind hingegen möglicherweise Zeichen des Bereichs nicht enthalten, die Sie erwartet hätten. Beispiel: SIMILAR TO '[a-c]' in einer Datenbank, die die Groß- und Kleinschreibung nicht berücksichtigt, enthält a, A, b, B, c, aber nicht C, weil C nach dem klein geschriebenen c in der Sortierreihenfolge kommt.

    • REGEXP gibt nur A, B, C zurück, ungeachtet der Berücksichtigung der Groß- und Kleinschreibung. Wenn der Bereich Kleinbuchstaben enthalten soll, müssen Sie sie in die Bereichsdefinition einfügen. Zum Beispiel, REGEXP '[a-cA-C]'.

    • Die REGEXP-Zeichenmenge ändert sich nicht, ungeachtet der Berücksichtigung der Groß- und Kleinschreibung durch die Datenbank.

    Auch wenn Ihre Datenbank eine andere Kollatierung verwendet oder andere Einstellungen für die Berücksichtigung der Groß-, Klein- und Akzentschreibung hat als die oben beschriebenen Datenbanken, können Sie einen ähnlichen Test durchführen, um zu ermitteln, was von LIKE, SIMILAR TO, oder REGEXP zurückgegeben wird, indem Sie sich mit der Datenbank verbinden und eine der folgenden Anweisungen ausführen:

    SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) LIKE '[A-C]';
    SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) REGEXP '[A-C]';
    SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) SIMILAR TO '[A-C]';

Siehe auch

LIKE-Suchbedingung
REGEXP-Suchbedingung
SIMILAR TO-Suchbedingung