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. passer
til
a
,b
ellerc
. Brug en bindestreg for at navngive en række tegn.passer til ethvert bogstav, mens
passer 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”.