3.3.4.7 Pattern Matching
MySQL biedt standaard SQL-patroonherkenning, evenals een vorm van patroonherkenning die is gebaseerd op uitgebreide reguliere expressies, vergelijkbaar met die welke worden gebruikt door Unix-hulpprogramma’s zoals vi, grep en sed.
SQL-patroonherkenning stelt u in staat om _
te gebruiken om overeen te komen met een enkel teken en %
om overeen te komen met een willekeurig aantal tekens (inclusief nultekens). In MySQL zijn SQL-patronen standaard hoofdletterongevoelig. Enkele voorbeelden worden hier getoond. Gebruik geen =
of <>
wanneer u SQL-patronen gebruikt. Gebruik in plaats daarvan de LIKE
of NOT LIKE
vergelijkingsoperatoren.
Om namen te vinden die beginnen met 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 |+--------+--------+---------+------+------------+------------+
Om namen te vinden die eindigen op 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 |+--------+--------+---------+------+------------+-------+
Om namen te vinden die een w
bevatten:
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 |+----------+-------+---------+------+------------+------------+
Om namen te vinden die precies vijf tekens bevatten, gebruikt u vijf instanties van het _
patroon teken:
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 |+-------+--------+---------+------+------------+-------+
De andere vorm van patroonherkenning die MySQL biedt, maakt gebruik van uitgebreide reguliere expressies. Wanneer u test op een overeenkomst voor dit type patroon, gebruikt u de REGEXP_LIKE()
-functie (of de REGEXP
– of RLIKE
-operatoren, die synoniemen zijn voor REGEXP_LIKE()
).
In de volgende lijst worden enkele kenmerken van uitgebreide reguliere expressies beschreven:
-
.
komt overeen met elk afzonderlijk teken. -
Een tekenklasse
komt overeen met elk teken binnen de haakjes.
komt bijvoorbeeld overeen met
a
,b
, ofc
. Om een reeks tekens te benoemen, gebruikt u een streepje.komt overeen met elke letter, terwijl
overeenkomt met elk cijfer.
-
*
komt overeen met nul of meer gevallen van het ding dat eraan voorafgaat. Bijvoorbeeld,x*
komt overeen met een willekeurig aantalx
-tekens,*
met een willekeurig aantal cijfers, en.*
met een willekeurig aantal om het even wat. -
Een patroon van een reguliere expressie slaagt als het patroon ergens in de geteste waarde overeenkomt. (Dit verschilt van een
LIKE
-patrooncombinatie, die alleen succesvol is als het patroon overeenkomt met de gehele waarde). -
Om een patroon te verankeren zodat het overeenkomt met het begin of einde van de waarde die wordt getest, gebruikt u
^
aan het begin of$
aan het einde van het patroon.
Om te demonstreren hoe uitgebreide reguliere expressies werken, worden de eerder getoonde LIKE
-query’s hier herschreven om REGEXP_LIKE()
te gebruiken.
Om namen te vinden die beginnen met b
, gebruikt u ^
om aan het begin van de naam te komen:
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 |+--------+--------+---------+------+------------+------------+
Om een reguliere expressievergelijking hoofdlettergevoelig te maken, gebruikt u een hoofdlettergevoelige collatie, of gebruikt u het sleutelwoord BINARY
om van een van de tekenreeksen een binaire tekenreeks te maken, of specificeert u het c
match-control teken. Elk van deze query’s komt alleen overeen met kleine letters b
aan het begin van een naam:
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');
Om namen te vinden die eindigen op fy
, gebruikt u $
om overeen te komen met het einde van de naam:
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 |+--------+--------+---------+------+------------+-------+
Om namen te vinden die een w
bevatten, gebruikt u deze query:
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 |+----------+-------+---------+------+------------+------------+
Omdat een regelmatig expressiepatroon overeenkomt als het ergens in de waarde voorkomt, is het in de vorige query niet nodig om een jokerteken aan weerszijden van het patroon te zetten om het overeen te laten komen met de hele waarde, zoals het geval zou zijn met een SQL-patroon.
Om namen te vinden die precies vijf tekens bevatten, gebruikt u ^
en $
om overeen te komen met het begin en einde van de naam, en vijf instanties van .
ertussen:
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 |+-------+--------+---------+------+------------+-------+
U zou de vorige query ook kunnen schrijven met de operator {
(“repeat-n
}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 |+-------+--------+---------+------+------------+-------+
Voor meer informatie over de syntaxis voor reguliere expressies, zie Paragraaf 12.8.2, “Reguliere Expressies”.