Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

2 maneiras de retornar linhas que contêm caracteres alfanuméricos no MySQL


Abaixo estão duas opções para encontrar as linhas que contêm caracteres alfanuméricos no MySQL.

Caracteres alfanuméricos são caracteres alfabéticos e caracteres numéricos.

Dados de amostra


Usaremos os seguintes dados para nossos exemplos:
CREATE TABLE t1 (
    c1 varchar(255) NULL
    );

INSERT INTO t1 VALUES
    ('Music'),
    ('Live Music'),
    ('Café'),
    ('Café Del Mar'),
    ('100 Cafés'),
    ('[email protected]'),
    ('1 + 1'),
    ('()'),
    ('[email protected]#&()–[{}]:;'',?/*'),
    ('`~$^+=<>“'),
    ('$1.50'),
    ('Player 456'),
    ('007'),
    (null),
    (''),
    ('é'),
    ('É'),
    ('é 123'),
    ('ø'),
    ('ø 123');
SELECT c1 FROM t1;

Resultado:
+----------------------+
| c1                   |
+----------------------+
| Music                |
| Live Music           |
| Café                 |
| Café Del Mar         |
| 100 Cafés            |
| [email protected]    |
| 1 + 1                |
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| $1.50                |
| Player 456           |
| 007                  |
| NULL                 |
|                      |
| é                    |
| É                    |
| é 123                |
| ø                    |
| ø 123                |
+----------------------+

Opção 1:Comparar com [:alnum:]


Podemos usar o REGEXP do MySQL operador para comparar nossa coluna com uma expressão regular.

A capacidade de expressão regular do MySQL inclui suporte para as classes de caracteres POSIX. Portanto, podemos usar o [:alnum:] classe de caracteres POSIX em nossas expressões regulares para localizar as linhas que contêm caracteres alfanuméricos.
SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:]]+$';

Resultado:
+-------+
| c1    |
+-------+
| Music |
| Café  |
| 007   |
| é     |
| É     |
| ø     |
+-------+

Isso retornou apenas as linhas que contêm nada além de caracteres alfanuméricos. Se uma linha contiver caracteres alfanuméricos e não alfanuméricos, ela não será retornada.

O caractere de espaço é considerado não alfanumérico e, portanto, se quisermos incluir espaços, podemos fazer isso:
SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:] ]+$';

Resultado:
+---------------+
| c1            |
+---------------+
| Music         |
| Live Music    |
| Café          |
| Café Del Mar  |
| 100 Cafés     |
| Player 456    |
| 007           |
| é             |
| É             |
| é 123         |
| ø             |
| ø 123         |
+---------------+

Para retornar todas as linhas que contêm caracteres alfanuméricos (mesmo que a linha também contenha caracteres não alfanuméricos), podemos fazer isso:
SELECT c1 FROM t1 
WHERE c1 REGEXP '[[:alnum:]]';

Resultado:
+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é                 |
| É                 |
| é 123             |
| ø                 |
| ø 123             |
+-------------------+

Opção 2:especificar um intervalo de caracteres


Outra maneira de fazer isso é fornecer uma expressão regular que forneça um intervalo de caracteres. Ainda podemos usar o REGEXP operador para fazer isso.

Exemplo:
SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9]+$';

Resultado:
+-------+
| c1    |
+-------+
| Music |
| 007   |
+-------+

Isso retornou menos linhas do que com nosso primeiro exemplo. Isso porque não incluí o é , É , ou ø caracteres no meu intervalo e, portanto, todas as linhas que contêm esses caracteres são excluídas da saída.

Portanto, você precisará ter cuidado ao usar esse método, caso exclua acidentalmente caracteres que deve incluir.

No entanto, mantendo esse intervalo, podemos incluir espaços como este:
SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

Resultado:
+------------+
| c1         |
+------------+
| Music      |
| Live Music |
| Player 456 |
| 007        |
+------------+

E podemos usar o seguinte para incluir todas as linhas que contêm caracteres do nosso intervalo (mesmo que também contenham caracteres fora desse intervalo):
SELECT c1 FROM t1 
WHERE c1 REGEXP '[A-Za-z0-9]';

Resultado:
+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é 123             |
| ø 123             |
+-------------------+

Alternativas para REGEXP


No MySQL, o RLIKE e REGXP operadores são sinônimos de REGEXP_LIKE() . Portanto, podemos substituir qualquer um dos exemplos anteriores por RLIKE ou REGEXP_LIKE() .

Exemplo de RLIKE :
SELECT c1 FROM t1 
WHERE c1 RLIKE '^[[:alnum:]]+$';

Exemplo de REGEXP_LIKE() :
SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');