3.3.4.4.7 Mönstermatchning
MySQL tillhandahåller standard SQL-mönstermatchning samt en form av mönstermatchning som baseras på utökade reguljära uttryck som liknar dem som används av Unix-verktyg som vi, grep och sed.
SQL-mönstermatchning gör det möjligt att använda _
för att matcha ett enskilt tecken och %
för att matcha ett godtyckligt antal tecken (inklusive nolltecken). I MySQL är SQL-mönster som standard skiftlägeskänsliga. Några exempel visas här. Använd inte =
eller <>
när du använder SQL-mönster. Använd istället jämförelseoperatorerna LIKE
eller NOT LIKE
.
För att hitta namn som börjar 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 |+--------+--------+---------+------+------------+------------+
För att hitta namn som slutar med 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 |+--------+--------+---------+------+------------+-------+
För att hitta namn som innehåller ett 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 |+----------+-------+---------+------+------------+------------+
Om du vill hitta namn som innehåller exakt fem tecken använder du fem exemplar av mönstret _
:
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 andra typen av mönstermatchning som MySQL tillhandahåller använder utökade reguljära uttryck. När du testar efter en matchning för den här typen av mönster använder du funktionen REGEXP_LIKE()
(eller operatörerna REGEXP
eller RLIKE
, som är synonymer för REGEXP_LIKE()
).
Följande lista beskriver några egenskaper hos utökade reguljära uttryck:
-
.
matchar alla enskilda tecken. -
En teckenklass
matchar alla tecken inom parenteserna. Exempelvis matchar
a
,b
ellerc
. Om du vill namnge ett teckenintervall använder du ett bindestreck.matchar alla bokstäver, medan
matchar alla siffror.
-
*
matchar noll eller fler förekomster av det som föregår det. Till exempel matcharx*
ett valfritt antalx
tecken,*
ett valfritt antal siffror och.*
ett valfritt antal vad som helst. -
En mönstermatchning i ett reguljärt uttryck lyckas om mönstret matchar någonstans i det värde som testas. (Detta skiljer sig från en
LIKE
-mönstermatchning, som endast lyckas om mönstret matchar hela värdet.) -
Om du vill förankra ett mönster så att det måste matcha början eller slutet av värdet som testas använder du
^
i början eller$
i slutet av mönstret.
För att demonstrera hur utökade reguljära uttryck fungerar skrivs LIKE
-förfrågningarna som visades tidigare om här för att använda REGEXP_LIKE()
.
För att hitta namn som börjar med b
använder du ^
för att matcha början av namnet:
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 du vill tvinga en jämförelse av reguljära uttryck att vara skiftlägeskänslig, använd en collation som är skiftlägeskänslig, använd nyckelordet BINARY
för att göra en av strängarna till en binär sträng, eller ange teckenet c
match-control. Var och en av de här sökningarna matchar endast små bokstäver b
i början av ett namn:
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');
För att hitta namn som slutar med fy
använder du $
för att matcha slutet av namnet:
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 |+--------+--------+---------+------+------------+-------+
För att hitta namn som innehåller ett w
, använd denna fråga:
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 |+----------+-------+---------+------+------------+------------+
Eftersom ett reguljärt uttrycksmönster matchar om det förekommer var som helst i värdet, är det inte nödvändigt att i den föregående frågan sätta ett jokertecken på vardera sidan av mönstret för att få det att matcha hela värdet, vilket skulle vara fallet med ett SQL-mönster.
Om du vill hitta namn som innehåller exakt fem tecken använder du ^
och $
för att matcha början och slutet av namnet och fem förekomster av .
däremellan:
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 kan också skriva föregående fråga med hjälp av operatorn {
(”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 |+-------+--------+---------+------+------------+-------+
Mer information om syntaxen för reguljära uttryck finns i avsnitt 12.8.2, ”Reguljära uttryck”.