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
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. Außerdem haben REGEXP und SIMILAR TO verschiedene Standard-Escapezeichen und die Zeichen Unterstrich (_), Prozent (%) und Einschaltungszeichen (^) werden unterschiedlich verarbeitet. 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.
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.
Ebenso können bei einer Datenbank mit Berücksichtigung der Groß- und Kleinschreibung einige in den Bereich einbezogene Zeichen
inkonsistent erscheinen. Zum Beispiel umfasst SIMILAR TO '[A-C]'
in einer Datenbank mit Berücksichtigung von Groß- und Kleinschreibung A, b, B, C, C nicht aber a, weil a in der Sortierreihenfolge
vor dem Großbuchstaben A steht.
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]'; |
LIKE-Suchbedingung
REGEXP-Suchbedingung
SIMILAR TO-Suchbedingung
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |