3.3.4.7 Pattern Matching

MySQL fornece padrão de correspondência de padrões SQL, bem como uma forma de correspondência de padrões baseada em expressões regulares estendidas semelhantes às utilizadas por utilitários Unix como vi, grep, e sed.

A correspondência de padrões SQL permite que você use _ para combinar qualquer caractere e % para combinar um número arbitrário de caracteres (incluindo zero caracteres). No MySQL, os padrões SQL são insensíveis a maiúsculas e minúsculas por padrão. Alguns exemplos são mostrados aqui. Não use = ou <> quando você usa padrões SQL. Use os operadores de comparação LIKE ou NOT LIKE em seu lugar.

para encontrar nomes que comecem 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 nomes que terminem com 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 nomes que contenham um 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 nomes contendo exatamente cinco caracteres, use cinco instâncias do caractere padrão _:

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

O outro tipo de correspondência de padrão fornecido pelo MySQL usa expressões regulares estendidas. Quando você testar para uma correspondência para este tipo de padrão, use a função REGEXP_LIKE() (ou os operadores REGEXP ou RLIKE, que são sinônimos para REGEXP_LIKE()).

A lista seguinte descreve algumas características de expressões regulares estendidas:

  • . corresponde a qualquer caractere único.

  • Uma classe de caracteres corresponde a qualquer caractere dentro dos parênteses. Por exemplo, corresponde a a, b, ou c. Para nomear um intervalo de caracteres, use um traço. corresponde a qualquer letra, enquanto corresponde a qualquer dígito.

  • * corresponde a zero ou mais instâncias da coisa que o precede. Por exemplo, x* corresponde a qualquer número de x caracteres, * corresponde a qualquer número de dígitos, e .* corresponde a qualquer número de qualquer coisa.

  • Uma correspondência de padrão de expressão regular é bem sucedida se o padrão corresponder a qualquer parte do valor a ser testado. (Isto difere de uma correspondência de padrão LIKE, que só é bem sucedida se o padrão corresponder a todo o valor).

  • Para ancorar um padrão de modo que ele deve corresponder ao início ou ao fim do valor a ser testado, use ^ no início ou $ no fim do padrão.

Para demonstrar como as expressões regulares estendidas funcionam, as LIKE consultas mostradas anteriormente são reescritas aqui para usar REGEXP_LIKE().

Para encontrar nomes começando com b, use ^ para combinar com o início do nome:

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 forçar uma comparação regular de expressões a ser sensível a maiúsculas e minúsculas, use uma comparação sensível a maiúsculas e minúsculas, ou use a palavra-chave BINARY para tornar uma das cadeias de caracteres uma cadeia binária, ou especifique o caractere c match-control. Cada uma destas consultas corresponde apenas a minúsculas b no início de um nome:

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 nomes terminando com fy, use $ para combinar com o fim do nome:

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 nomes contendo um w, use 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 |+----------+-------+---------+------+------------+------------+

Porque um padrão de expressão regular corresponde se ocorrer em qualquer parte do valor, não é necessário na consulta anterior colocar um wildcard em ambos os lados do padrão para que ele corresponda ao valor inteiro, como seria verdade com um padrão SQL.

Para encontrar nomes contendo exatamente cinco caracteres, use ^ e $ para combinar o início e o fim do nome, e cinco instâncias de . no meio:

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

Você também poderia escrever a consulta anterior usando o operador {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 |+-------+--------+---------+------+------------+-------+

Para mais informações sobre a sintaxe das expressões regulares, veja Secção 12.8.2, “Expressões regulares”.

Deixe uma resposta

O seu endereço de email não será publicado.