3.3.4.7 Dopasowywanie wzorców

MySQL udostępnia standardowe dopasowywanie wzorców SQL, jak również formę dopasowywania wzorców opartą na rozszerzonych wyrażeniach regularnych, podobnych do tych używanych przez narzędzia uniksowe, takie jak vi, grep i sed.

Dopasowywanie wzorców SQL pozwala na użycie _ do dopasowania dowolnego pojedynczego znaku oraz % do dopasowania dowolnej liczby znaków (w tym znaków zerowych). W MySQL domyślnie rozróżniana jest wielkość liter. Niektóre przykłady są pokazane tutaj. Nie używaj = lub <> podczas korzystania z wzorców SQL. Zamiast tego użyj operatorów porównania LIKE lub NOT LIKE.

Aby znaleźć nazwy zaczynające się od b:

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 |+--------+--------+---------+------+------------+------------+

Aby znaleźć nazwy kończące się na fy:

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 |+--------+--------+---------+------+------------+-------+

Aby znaleźć nazwy zawierające w:

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 |+----------+-------+---------+------+------------+------------+

Aby znaleźć nazwy zawierające dokładnie pięć znaków, użyj pięciu wystąpień znaku wzorca _:

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 |+-------+--------+---------+------+------------+-------+

Drugi typ dopasowywania wzorców udostępniany przez MySQL wykorzystuje rozszerzone wyrażenia regularne. Gdy testujesz dopasowanie dla tego typu wzorca, użyj funkcji REGEXP_LIKE() (lub operatorów REGEXP lub RLIKE, które są synonimami dla REGEXP_LIKE()).

Poniższa lista opisuje niektóre cechy rozszerzonych wyrażeń regularnych:

  • . dopasowuje dowolny pojedynczy znak.

  • Klasa znaków pasuje do dowolnego znaku wewnątrz nawiasów. Na przykład, pasuje do a, b lub c. Aby nazwać zakres znaków, należy użyć myślnika. pasuje do każdej litery, a do każdej cyfry.

  • * dopasowuje zero lub więcej wystąpień poprzedzającej go rzeczy. Na przykład x* dopasowuje dowolną liczbę znaków x, * dopasowuje dowolną liczbę cyfr, a .* dopasowuje dowolną liczbę czegokolwiek.

  • Dopasowanie wzorca wyrażenia regularnego powiedzie się, jeśli wzorzec pasuje w dowolnym miejscu testowanej wartości. (Różni się to od dopasowania wzorca LIKE, które powiedzie się tylko wtedy, gdy wzorzec pasuje do całej wartości).

  • Aby zakotwiczyć wzorzec tak, że musi on pasować do początku lub końca testowanej wartości, należy użyć ^ na początku lub $ na końcu wzorca.

Aby zademonstrować, jak działają rozszerzone wyrażenia regularne, pokazane wcześniej zapytania LIKE zostały tutaj przepisane na REGEXP_LIKE().

Aby znaleźć nazwy zaczynające się od b, należy użyć ^ do dopasowania początku nazwy:

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 |+--------+--------+---------+------+------------+------------+

Aby wymusić, aby porównanie wyrażeń regularnych uwzględniało wielkość liter, należy użyć kolacji uwzględniającej wielkość liter lub użyć słowa kluczowego BINARY, aby jeden z łańcuchów był łańcuchem binarnym, lub określić znak c kontroli dopasowania. Każde z tych zapytań dopasowuje tylko małe litery b na początku nazwy:

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');

Aby znaleźć nazwy kończące się na fy, użyj $, aby dopasować koniec nazwy:

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 |+--------+--------+---------+------+------------+-------+

Aby znaleźć nazwy zawierające w, użyj tego zapytania:

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 |+----------+-------+---------+------+------------+------------+

Ponieważ wzorzec wyrażenia regularnego pasuje, jeśli występuje w dowolnym miejscu wartości, w poprzednim zapytaniu nie jest konieczne umieszczanie symbolu wieloznacznego po obu stronach wzorca, aby dopasować go do całej wartości, co byłoby prawdą w przypadku wzorca SQL.

Aby znaleźć nazwy zawierające dokładnie pięć znaków, użyj ^ i $, aby dopasować początek i koniec nazwy oraz pięć wystąpień . pomiędzy nimi:

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 |+-------+--------+---------+------+------------+-------+

Mogłabyś również napisać poprzednie zapytanie, używając operatora {n} („repeat-n-times”):

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 |+-------+--------+---------+------+------------+-------+

Więcej informacji na temat składni wyrażeń regularnych znajdziesz w rozdziale 12.8.2, „Wyrażenia regularne”.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.