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 eller c. 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. passer x* til et vilkårligt antal x-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 {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 |+-------+--------+---------+------+------------+-------+

Du kan finde flere oplysninger om syntaksen for regulære udtryk i afsnit 12.8.2, “Regulære udtryk”.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.