3.3.4.7 Porovnávání vzorů

MySQL poskytuje standardní SQL porovnávání vzorů a také formu porovnávání vzorů založenou na rozšířených regulárních výrazech podobných těm, které používají unixové nástroje jako vi, grep a sed.

SQL porovnávání vzorů umožňuje použít _ pro porovnání libovolného jednotlivého znaku a % pro porovnání libovolného počtu znaků (včetně nulových znaků). V databázi MySQL vzory SQL ve výchozím nastavení nerozlišují velká a malá písmena. Některé příklady jsou uvedeny zde. Při použití vzorů SQL nepoužívejte = ani <>. Místo toho použijte porovnávací operátory LIKE nebo NOT LIKE.

Chcete-li vyhledat názvy začínající 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 |+--------+--------+---------+------+------------+------------+

Chcete-li najít názvy končící na 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 |+--------+--------+---------+------+------------+-------+

Pro vyhledání jmen obsahujících 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 |+----------+-------+---------+------+------------+------------+

Chcete-li najít jména obsahující přesně pět znaků, použijte pět výskytů vzorového znaku _:

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 |+-------+--------+---------+------+------------+-------+

Druhý typ porovnávání vzorů, který poskytuje MySQL, používá rozšířené regulární výrazy. Při testování shody tohoto typu vzoru použijte funkci REGEXP_LIKE() (nebo operátory REGEXP nebo RLIKE, které jsou synonymy pro REGEXP_LIKE()).

Následující seznam popisuje některé vlastnosti rozšířených regulárních výrazů:

  • . odpovídá libovolnému jednotlivému znaku.

  • Třída znaků odpovídá libovolnému znaku uvnitř závorek. Například odpovídá a, b nebo c. Chcete-li pojmenovat rozsah znaků, použijte pomlčku. odpovídá libovolnému písmenu, zatímco odpovídá libovolné číslici.

  • * odpovídá nule nebo více výskytům věci, která mu předchází. Například x* odpovídá libovolnému počtu znaků x, * odpovídá libovolnému počtu číslic a .* odpovídá libovolnému počtu čehokoli.

  • Shoda vzoru regulárního výrazu je úspěšná, pokud vzor odpovídá kdekoli v testované hodnotě. (Tím se liší od shody vzoru LIKE, která je úspěšná pouze tehdy, pokud vzor odpovídá celé hodnotě.)

  • Chcete-li ukotvit vzor tak, aby se musel shodovat se začátkem nebo koncem testované hodnoty, použijte ^ na začátku nebo $ na konci vzoru.

Pro demonstraci fungování rozšířených regulárních výrazů jsou zde dříve uvedené dotazy LIKE přepsány tak, že používají REGEXP_LIKE().

Chcete-li najít jména začínající na b, použijte ^ pro porovnání začátku jména:

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 |+--------+--------+---------+------+------------+------------+

Chcete-li vynutit porovnávání regulárních výrazů s rozlišováním malých a velkých písmen, použijte collation s rozlišováním velkých a malých písmen, nebo použijte klíčové slovo BINARY, aby se jeden z řetězců stal binárním řetězcem, nebo zadejte znak c pro kontrolu shody. Každý z těchto dotazů odpovídá pouze malým písmenům b na začátku názvu:

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');

Chcete-li najít jména končící fy, použijte $ pro porovnání konce jména:

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 |+--------+--------+---------+------+------------+-------+

Chcete-li najít jména obsahující w, použijte tento dotaz:

Chcete-li najít jména obsahující přesně pět znaků, použijte ^ a $ pro shodu se začátkem a koncem jména a pěti výskytů . mezi nimi:

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 |+-------+--------+---------+------+------------+-------+

Předchozí dotaz můžete také zapsat pomocí operátoru {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 |+-------+--------+---------+------+------------+-------+

Další informace o syntaxi regulárních výrazů najdete v kapitole 12.8.2, „Regulární výrazy“.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.