3.3.4.7 Pattern Matching
MySQL tarjoaa vakiomuotoisen SQL:n hahmontäsmäytyksen sekä hahmontäsmäytyksen eräänlaisen laajennettuihin säännönmukaisiin lausekkeisiin (extended regular expressions) perustuvan hahmontäsmäytyksen, joka on samankaltainen kuin ne hahmontäsmäytyksen muodot, jotka ovat peräisin Unixin apuohjelmista, joita käytetään sellaisissa apuohjelmissa, kuten vi:ssä, grep:ssä ja sedissä.
SQL-kuvioiden täsmäytyksen avulla voit käyttää _
-merkkiä mihin tahansa yksittäiseen merkkiin ja %
-merkkiä mielivaltaiseen määrään merkkejä (mukaan lukien nollamerkit). MySQL:ssä SQL-kuviot eivät oletusarvoisesti erota isoja ja pieniä kirjaimia. Joitakin esimerkkejä on esitetty tässä. Älä käytä =
tai <>
, kun käytät SQL-kuvioita. Käytä sen sijaan vertailuoperaattoreita LIKE
tai NOT LIKE
.
Voit etsiä b
-alkuisia nimiä:
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 |+--------+--------+---------+------+------------+------------+
Voit etsiä nimiä, jotka päättyvät 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 |+--------+--------+---------+------+------------+-------+
Etsitään nimiä, jotka sisältävät 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 |+----------+-------+---------+------+------------+------------+
Jos haluat etsiä nimiä, jotka sisältävät täsmälleen viisi merkkiä, käytä viittä kertaa _
-hahmomerkkiä:
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 |+-------+--------+---------+------+------------+-------+
Toinen MySQL:n tarjoama kuviosovitustyyppi käyttää laajennettuja säännöllisiä lausekkeita. Kun testaat tämäntyyppisen kuvion vastaavuutta, käytä REGEXP_LIKE()
-funktiota (tai REGEXP
– tai RLIKE
-operaattoreita, jotka ovat REGEXP_LIKE()
:n synonyymejä).
Seuraavassa luettelossa kuvataan joitakin laajennettujen säännöllisten lausekkeiden ominaisuuksia:
-
.
vastaa mitä tahansa yksittäistä merkkiä. -
Merkkiluokka
vastaa mitä tahansa suluissa olevaa merkkiä. Esimerkiksi
vastaa
a
,b
taic
. Jos haluat nimetä merkkijonon, käytä ajatusviivaa.vastaa mitä tahansa kirjainta, kun taas
vastaa mitä tahansa numeroa.
-
*
vastaa nollaa tai useampaa edeltävää asiaa. Esimerkiksix*
vastaa mitä tahansa määrääx
-merkkejä,*
vastaa mitä tahansa määrää numeroita ja.*
vastaa mitä tahansa määrää mitä tahansa. -
Säännöllisen lausekkeen kuvion vastaavuus onnistuu, jos kuvio täsmää mihin tahansa testattavaan arvoon. (Tämä eroaa
LIKE
-kuvion vastaavuudesta, joka onnistuu vain, jos kuvio vastaa koko arvoa). -
Jos haluat ankkuroida kuvion niin, että sen on vastattava testattavan arvon alkua tai loppua, käytä kuvion alussa
^
tai lopussa$
.
Laajennettujen säännöllisten lausekkeiden toiminnan havainnollistamiseksi aiemmin esitetyt LIKE
-kyselyt kirjoitetaan tässä uudelleen siten, että niissä käytetään REGEXP_LIKE()
.
Jos haluat löytää b
-alkuisia nimiä, käytä ^
:tä nimen alkuun:
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 |+--------+--------+---------+------+------------+------------+
Jos haluat pakottaa säännöllisen lausekkeen vertailun olemaan isojen ja pienten kirjainten suhteen erilainen, käytä isojen ja pienten kirjainten suhteen erilaista rinnastusta tai käytä BINARY
-avainsanaa tehdäksesi jommastakummasta merkkijonosta binäärisen merkkijonon tai määritä c
-täsmäysohjausmerkki. Kukin näistä kyselyistä vastaa vain pienaakkosia b
nimen alussa: $
:tä nimen loppuun:
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 |+--------+--------+---------+------+------------+-------+
Jos haluat löytää nimiä, jotka sisältävät w
, käytä tätä kyselyä:
Jos haluat löytää täsmälleen viisi merkkiä sisältäviä nimiä, käytä ^
ja $
täsmäämään nimen alkuun ja loppuun ja viisi .
-merkkiä niiden välissä:
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 |+-------+--------+---------+------+------------+-------+
Voit myös kirjoittaa edellisen kyselyn käyttämällä operaattoria {
(”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 |+-------+--------+---------+------+------------+-------+
Lisätietoja säännöllisten lausekkeiden syntaksista on kohdassa 12.8.2, ”Säännölliset lausekkeet”.