Combinação de padrões
O MariaDB fornece combinação de padrões do SQL bem como na forma de combinação de padrões baseado nas expressões regulares extendidas similares àquelas usadas pelos utilitários Unix como o vi
, grep
e sed
.
A combinação de padrões SQL lhe permite você usar _
para coincidir qualquer caractere simples e %
para coincidir um número arbitrário de caracteres (incluindo zero caracter). No MySQL, padrões SQL são caso insensitivo por padrão. Alguns exemplos são vistos abaixo. Perceba que você não usa =
ou !=
quando usar padrões SQL; use os operadores de comparação LIKE
ou NOT LIKE
neste caso.
Para encontrar nomes começando com '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 com o final '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 contendo 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 caracter '_
':
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 combinação de padrões fornecido pelo MariaDB usa expressões regulares extendidas. Quando você testa por uma combinação para este tipo de padrão, utilize os operadores REGEXP
e NOT REGEXP
(ou RLIKE
e NOT RLIKE
, que são sinônimos).
Algumas características das expressões regulares extendidas são:
- '
.
' combina qualquer caractere único - Uma classe de caracteres '
[...]
' combina qualquer caractere que consta dentro dos colchetes. Por exemplo, '[abc]
' combina com 'a
', 'b
', ou 'c
'. Para nomear uma sequência de caracteres utilize um traço. '[a-z]
' combina com qualquer letra e '[0-9]
' combina com qualquer dígito. - '
*
' combina com nenhuma ou mais instâncias de sua precedência. Por exemplo, 'x*
' combina com qualquer número de caracteres 'x
', '[0-9]*
' combina com qualquer número de dígitos e '.*
' combina com qualquer número de qualquer coisa. - Um padrão
REGEXP
casa com sucesso se ele ocorre em algum lugar no valor sendo testado. (Ele difere do padrãoLIKE
, que só obtem suceeso se eles combinarem com todo o valor.) - Para fazer com que um padrão deva combinar com o começo ou o fim de um valor sendo testado, utilize '
^
' no começo ou '$
' no final do padrão.
Para demonstrar como expressões regulares extendidas funcionam, as consultas com LIKE
mostradas acima foram reescritas abaixo usando REGEXP
.
Para encontrar nomes começando com 'b
', utilize '^
' para combinar com o começo do nome:
mysql> SELECT * FROM pet WHERE name REGEXP '^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 |
+--------+--------+---------+------+------------+------------+
Antes da versão 3.23.4 do MariaDB, REGEXP
era caso sensitivo, e a consulta anterior não iria retornar nenhum registro. Neste caso, para combinar letras 'b
' maiúsculas e minúsculas, utilize esta consulta:
mysql> SELECT * FROM pet WHERE name REGEXP '^[bB]';
A partir do MariaDB 3.23.4, se você realmente deseja forçar uma comparação REGEXP
com caso sensitivo, utilize a palavra-chave BINARY
para tornar uma das strings em uma string binárias. Esta consulta irá combinar somente com 'b
's minúsculos no começo de um nome:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
Para encontrar nomes finalizados com 'fy
', utilize '$
' para combinar com o final do nome:
mysql> SELECT * FROM pet WHERE name REGEXP '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
', utilize esta consulta:
mysql> SELECT * FROM pet WHERE name REGEXP '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 uma expressão regular extendida encontra padrões coincidentes se eles ocorrem em qualquer lugar no valor comparado, não é necessário utiliar, na consulta anterior, nenhum metacaracter em nenhum dos lados do padrão para fazê-lo coincidir com todo o valor, como seria feito se fosse utilizado o padrão SQL.
Para encontrar nomes contendo exatamente cinco caracteres, utilize '^
' e '$
' para combinar com o começo e fim do nome e cinco instâncias de '.
' entre eles.
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Você pode também escrever a consulta anterior utilizando o operador '{n}
' repete-
:
n
-vezes