3.3.4.4.7 Mønstermatchning
MySQL tilbyder standard SQL-mønstermatchning samt en form for mønstermatchning baseret på udvidede regulære udtryk svarende til dem, der bruges af Unix-hjælpsprogrammer som vi, grep og sed.
SQL-mønstermatchning giver dig mulighed for at bruge _ til at matche et hvilket som helst enkelt tegn og % til at matche et vilkårligt antal tegn (inklusive nultegn). I MySQL er SQL-mønstre som standard ikke skelnes mellem store og små bogstaver. Nogle eksempler er vist her. Du må ikke bruge = eller <>, når du bruger SQL-mønstre. Brug i stedet sammenligningsoperatorerne LIKE eller NOT LIKE.
Sådan finder du navne, der begynder med 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 |+--------+--------+---------+------+------------+------------+
Sådan finder du navne, der slutter med fy:
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 |+--------+--------+---------+------+------------+------------+
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 |+--------+--------+---------+------+------------+-------+
Sådan finder du navne, der indeholder et 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 |+----------+-------+---------+------+------------+------------+
Hvis du vil finde navne, der indeholder præcis fem tegn, skal du bruge fem forekomster af mønstertegnet _:
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 |+-------+--------+---------+------+------------+-------+
Den anden type mønstermatchning, der leveres af MySQL, bruger udvidede regulære udtryk. Når du tester for et match for denne type mønster, skal du bruge REGEXP_LIKE()-funktionen (eller REGEXP– eller RLIKE-operatorerne, som er synonymer for REGEXP_LIKE()).
Følgende liste beskriver nogle egenskaber ved udvidede regulære udtryk:
-
.matcher et hvilket som helst enkelt tegn. -
En tegnklasse
passer til ethvert tegn inden for parentesen. F.eks. passertila,bellerc. Brug en bindestreg for at navngive en række tegn.passer til ethvert bogstav, menspasser til ethvert ciffer. -
*matcher nul eller flere forekomster af det, der går forud. F.eks. passerx*til et vilkårligt antalx-tegn,*til et vilkårligt antal cifre, og.*til et vilkårligt antal af hvad som helst. -
Et mønstermatch med et regulært udtryk lykkes, hvis mønsteret passer et sted i den værdi, der testes. (Dette adskiller sig fra et
LIKE-mønstermatch, som kun lykkes, hvis mønsteret passer til hele værdien). -
Hvis du vil forankre et mønster, så det skal matche begyndelsen eller slutningen af den værdi, der testes, skal du bruge
^i begyndelsen eller$i slutningen af mønsteret.
For at demonstrere, hvordan udvidede regulære udtryk fungerer, er de tidligere viste LIKE-forespørgsler omskrevet her til at bruge REGEXP_LIKE().
Hvis du vil finde navne, der begynder med b, skal du bruge ^ til at matche begyndelsen af navnet:
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 |+--------+--------+---------+------+------------+------------+
Hvis du vil tvinge en sammenligning af regulære udtryk til at være case-sensitiv, skal du bruge en case-sensitiv kollationering, eller bruge nøgleordet BINARY til at gøre en af strengene til en binær streng, eller angive match-kontroltegnet c. Hver af disse forespørgsler matcher kun b med små bogstaver i begyndelsen af et navn:
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');
Hvis du vil finde navne, der slutter med fy, skal du bruge $ til at matche slutningen af navnet:
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 |+--------+--------+---------+------+------------+-------+
Hvis du vil finde navne, der indeholder et w, skal du bruge denne forespørgsel:
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 et regulært udtryksmønster passer, hvis det forekommer et hvilket som helst sted i værdien, er det ikke nødvendigt i den foregående forespørgsel at sætte et jokertegn på hver side af mønsteret for at få det til at passe til hele værdien, som det ville være tilfældet med et SQL-mønster.
Hvis du vil finde navne, der indeholder præcis fem tegn, skal du bruge ^ og $ til at matche begyndelsen og slutningen af navnet og fem forekomster af . i mellem:
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 |+-------+--------+---------+------+------------+-------+
Du kunne også skrive den foregående forespørgsel ved hjælp af operatoren { (“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 |+-------+--------+---------+------+------------+-------+
Du kan finde flere oplysninger om syntaksen for regulære udtryk i afsnit 12.8.2, “Regulære udtryk”.