3.3.4.7 Mintaillesztés
A MySQL szabványos SQL-mintaillesztést, valamint egy olyan kiterjesztett reguláris kifejezéseken alapuló mintaillesztést biztosít, amelyet a Unix segédprogramok, például a vi, grep és sed használnak.
Az SQL mintaillesztés lehetővé teszi, hogy a _ segítségével bármely egyetlen karakterrel, a % segítségével pedig tetszőleges számú karakterrel (beleértve a nulla karaktereket is) egyezzen meg. A MySQL-ben az SQL-minták alapértelmezés szerint nem érzékenyek a nagy- és kisbetűkre. Néhány példa itt látható. Ne használjon = vagy <> karaktert, amikor SQL-mintákat használ. Használja helyette a LIKE vagy NOT LIKE összehasonlító operátorokat.
A b kezdetű nevek kereséséhez:
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 |+--------+--------+---------+------+------------+------------+
fy végződésű nevek kereséséhez:
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 |+--------+--------+---------+------+------------+-------+
w-t tartalmazó nevek kereséséhez:
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 |+----------+-------+---------+------+------------+------------+
Pontosan öt karaktert tartalmazó nevek kereséséhez használja a _ mintakarakter öt példányát:
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 |+-------+--------+---------+------+------------+-------+
A MySQL által biztosított másik típusú mintaillesztés a kiterjesztett reguláris kifejezéseket használja. Az ilyen típusú minták egyezésének vizsgálatakor használja a REGEXP_LIKE() függvényt (vagy a REGEXP vagy RLIKE operátorokat, amelyek a REGEXP_LIKE() szinonimái).
A következő lista a kiterjesztett reguláris kifejezések néhány jellemzőjét írja le:
-
.bármely egyetlen karakterrel megegyezik. -
A
karakterosztály bármely, zárójelben lévő karakterre illeszkedik. Például amegfelel aa,bvagyckaraktereknek. Karaktertartományok megnevezéséhez használjon kötőjelet. Abármely betűre, míg abármely számjegyre illik. -
*megfelel az előtte lévő dolog nulla vagy több példányának. Például ax*axkarakterek tetszőleges számával, a*a számjegyek tetszőleges számával, a.*pedig a bárminek tetszőleges számával egyezik meg. -
A reguláris kifejezés mintaillesztése akkor sikeres, ha a minta a vizsgált értékben bárhol egyezik. (Ez eltér a
LIKEmintaillesztéstől, amely csak akkor jár sikerrel, ha a minta a teljes értékre illik). -
Egy minta lehorgonyzásához, hogy annak a vizsgált érték elejére vagy végére kell illeszkednie, használjon
^-t a minta elején vagy$-t a minta végén.
A kiterjesztett reguláris kifejezések működésének bemutatásához a korábban bemutatott LIKE lekérdezéseket itt átírjuk a REGEXP_LIKE() használatára.
A b kezdetű nevek megtalálásához használja a ^ szót a név elejére:
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 |+--------+--------+---------+------+------------+------------+
Ha a reguláris kifejezések összehasonlítását eset-érzékenységre akarja kényszeríteni, használjon eset-érzékeny összevetést, vagy használja a BINARY kulcsszót, hogy az egyik karakterláncot bináris karakterlánccá tegye, vagy adja meg a c egyezésvezérlő karaktert. Ezen lekérdezések mindegyike csak a név elején lévő b kisbetűs karakterekre illeszkedik: fy-val végződő nevek megtalálásához használja a $-t a név végére való illesztéshez:
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 |+--------+--------+---------+------+------------+-------+
Ha w-t tartalmazó neveket szeretne találni, használja ezt a lekérdezést:
Pontosan öt karaktert tartalmazó nevek kereséséhez használja a ^ és $ karaktereket a név elejére és végére, valamint a . öt példányát a kettő között:
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 |+-------+--------+---------+------+------------+-------+
Az előző lekérdezést a { (“repeat-n}n-times”) operátorral is megírhatja:
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 |+-------+--------+---------+------+------------+-------+
A reguláris kifejezések szintaxisáról bővebben lásd a 12.8.2. szakasz “Reguláris kifejezések” című fejezetét.