3.3.4.7 Concordancia de Patrones

MySQL proporciona una concordancia de patrones SQL estándar así como una forma de concordancia de patrones basada en expresiones regulares extendidas similares a las utilizadas por utilidades Unix como vi, grep y sed.

La coincidencia de patrones SQL le permite utilizar _ para coincidir con cualquier carácter único y % para coincidir con un número arbitrario de caracteres (incluyendo caracteres cero). En MySQL, los patrones SQL no distinguen entre mayúsculas y minúsculas por defecto. Aquí se muestran algunos ejemplos. No utilice = o <> cuando utilice patrones SQL. Utilice en su lugar los operadores de comparación LIKE o NOT LIKE.

Para buscar nombres que empiecen por 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 |+--------+--------+---------+------+------------+------------+

Para encontrar nombres que terminen en 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 |+--------+--------+---------+------+------------+-------+

Para encontrar nombres que contengan un 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 |+----------+-------+---------+------+------------+------------+

Para encontrar nombres que contengan exactamente cinco caracteres, utilice cinco instancias del carácter patrón _:

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

El otro tipo de coincidencia de patrones que proporciona MySQL utiliza expresiones regulares extendidas. Cuando busque una coincidencia para este tipo de patrón, utilice la función REGEXP_LIKE() (o los operadores REGEXP o RLIKE, que son sinónimos de REGEXP_LIKE()).

La siguiente lista describe algunas características de las expresiones regulares extendidas:

  • . coincide con cualquier carácter único.

  • Una clase de caracteres coincide con cualquier carácter dentro de los paréntesis. Por ejemplo, coincide con a, b o c. Para nombrar un rango de caracteres, utilice un guión. coincide con cualquier letra, mientras que coincide con cualquier dígito.

  • * coincide con cero o más instancias de lo que le precede. Por ejemplo, x* coincide con cualquier número de caracteres x, * coincide con cualquier número de dígitos, y .* coincide con cualquier número de cualquier cosa.

  • Una coincidencia de patrón de expresión regular tiene éxito si el patrón coincide con cualquier parte del valor que se está probando. (Esto difiere de una coincidencia de patrón LIKE, que tiene éxito sólo si el patrón coincide con todo el valor).

  • Para anclar un patrón de forma que deba coincidir con el principio o el final del valor que se está comprobando, utilice ^ al principio o $ al final del patrón.

Para demostrar cómo funcionan las expresiones regulares extendidas, las consultas LIKE mostradas anteriormente se reescriben aquí para utilizar REGEXP_LIKE().

Para encontrar nombres que comienzan con b, utilice ^ para que coincida con el comienzo del nombre:

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

Para forzar que una comparación de expresión regular distinga entre mayúsculas y minúsculas, utilice una colación que distinga entre mayúsculas y minúsculas, o utilice la palabra clave BINARY para que una de las cadenas sea una cadena binaria, o especifique el carácter de control de coincidencia c. Cada una de estas consultas coincide sólo con las minúsculas b al principio de un nombre:

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

Para encontrar nombres que terminen en fy, utilice $ para que coincida con el final del nombre:

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

Para encontrar nombres que contengan un w, utilice esta consulta:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '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 |+----------+-------+---------+------+------------+------------+

Como un patrón de expresión regular coincide si aparece en cualquier parte del valor, no es necesario en la consulta anterior poner un comodín a cada lado del patrón para conseguir que coincida con todo el valor, como ocurriría con un patrón SQL.

Para encontrar nombres que contengan exactamente cinco caracteres, utilice ^ y $ para que coincidan con el principio y el final del nombre, y cinco instancias de . en medio:

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

También podría escribir la consulta anterior utilizando el operador {n} («repetir-n– veces»):

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

Para más información sobre la sintaxis de las expresiones regulares, véase el apartado 12.8.2, «Expresiones regulares».

Deja una respuesta

Tu dirección de correo electrónico no será publicada.