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ä. Esimerkiksivastaaa,btaic. Jos haluat nimetä merkkijonon, käytä ajatusviivaa.vastaa mitä tahansa kirjainta, kun taasvastaa 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”.