3.3.4.7 Mustervergleich

MySQL bietet sowohl den Standard-SQL-Mustervergleich als auch eine Form des Mustervergleichs, die auf erweiterten regulären Ausdrücken basiert, ähnlich denen, die von Unix-Dienstprogrammen wie vi, grep und sed benutzt werden.

Der SQL-Musterabgleich ermöglicht es Ihnen, _ zu verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, und %, um eine beliebige Anzahl von Zeichen (einschließlich Nullzeichen) abzugleichen. In MySQL sind SQL-Muster standardmäßig unabhängig von der Groß- und Kleinschreibung. Einige Beispiele werden hier gezeigt. Verwenden Sie nicht = oder <>, wenn Sie SQL-Muster verwenden. Verwenden Sie stattdessen die Vergleichsoperatoren LIKE oder NOT LIKE.

Um Namen zu finden, die mit b beginnen:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+

Um Namen zu finden, die mit fy enden:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+

Um Namen zu finden, die ein w enthalten:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+

Um Namen zu finden, die genau fünf Zeichen enthalten, verwenden Sie fünf Instanzen des Musterzeichens _:

mysql> SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+

Die andere Art des Musterabgleichs, die von MySQL bereitgestellt wird, verwendet erweiterte reguläre Ausdrücke. Wenn Sie auf eine Übereinstimmung für diese Art von Muster testen, verwenden Sie die Funktion REGEXP_LIKE() (oder die Operatoren REGEXP oder RLIKE, die Synonyme für REGEXP_LIKE() sind).

Die folgende Liste beschreibt einige Eigenschaften von erweiterten regulären Ausdrücken:

  • . passt auf jedes einzelne Zeichen.

  • Eine Zeichenklasse passt auf jedes beliebige Zeichen innerhalb der Klammern. Zum Beispiel passt zu a, b oder c. Um einen Bereich von Zeichen zu benennen, verwenden Sie einen Bindestrich. passt zu jedem Buchstaben, während zu jeder Ziffer passt.

  • * passt auf null oder mehr Instanzen des vorhergehenden Zeichens. Zum Beispiel passt x* zu einer beliebigen Anzahl von x Zeichen, * zu einer beliebigen Anzahl von Ziffern und .* zu einer beliebigen Anzahl von irgendetwas.

  • Eine Musterübereinstimmung eines regulären Ausdrucks ist erfolgreich, wenn das Muster an einer beliebigen Stelle des zu prüfenden Wertes übereinstimmt. (Dies unterscheidet sich von einer LIKE-Musterübereinstimmung, die nur dann erfolgreich ist, wenn das Muster auf den gesamten Wert zutrifft.)

  • Um ein Muster so zu verankern, dass es auf den Anfang oder das Ende des zu prüfenden Wertes passen muss, verwenden Sie ^ am Anfang oder $ am Ende des Musters.

Um zu demonstrieren, wie erweiterte reguläre Ausdrücke funktionieren, werden die zuvor gezeigten LIKE-Abfragen hier umgeschrieben, um REGEXP_LIKE() zu verwenden.

Um Namen zu finden, die mit b beginnen, verwenden Sie ^, um den Anfang des Namens zu finden:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+

Um einen Vergleich mit regulären Ausdrücken zwischen Groß- und Kleinschreibung zu erzwingen, verwenden Sie eine Sortierreihenfolge, die Groß- und Kleinschreibung berücksichtigt, oder verwenden Sie das Schlüsselwort BINARY, um eine der Zeichenketten zu einer binären Zeichenkette zu machen, oder geben Sie das Übereinstimmungssteuerungszeichen c an. Jede dieser Abfragen findet nur Kleinbuchstaben b am Anfang eines Namens:

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');

Um Namen zu finden, die mit fy enden, verwenden Sie $, um das Ende des Namens zu finden:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+

Um Namen zu finden, die ein w enthalten, verwenden Sie diese Abfrage:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+

Da ein Muster eines regulären Ausdrucks immer dann passt, wenn es an einer beliebigen Stelle des Wertes vorkommt, ist es in der vorherigen Abfrage nicht erforderlich, einen Platzhalter auf beiden Seiten des Musters einzufügen, damit es auf den gesamten Wert passt, wie es bei einem SQL-Muster der Fall wäre.

Um Namen zu finden, die genau fünf Zeichen enthalten, verwenden Sie ^ und $, um den Anfang und das Ende des Namens zu finden, und fünf Instanzen von . dazwischen:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+

Sie könnten die vorherige Abfrage auch mit dem Operator {n} („repeat-n-times“) schreiben:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+

Weitere Informationen über die Syntax für reguläre Ausdrücke finden Sie in Abschnitt 12.8.2, „Reguläre Ausdrücke“.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.