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 tai c. Jos haluat nimetä merkkijonon, käytä ajatusviivaa. vastaa mitä tahansa kirjainta, kun taas vastaa mitä tahansa numeroa.

  • * vastaa nollaa tai useampaa edeltävää asiaa. Esimerkiksi x* 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: fy:aan, käytä $: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 {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 |+-------+--------+---------+------+------------+-------+

Lisätietoja säännöllisten lausekkeiden syntaksista on kohdassa 12.8.2, ”Säännölliset lausekkeet”.

Vastaa

Sähköpostiosoitettasi ei julkaista.