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

2 maneiras de retornar linhas que contêm apenas caracteres não alfanuméricos no MySQL


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

Caracteres não alfanuméricos incluem caracteres de pontuação como [email protected]#&()–[{}]:;',?/* e símbolos como `~$^+=<>“ , bem como caracteres de espaço em branco, como os caracteres de espaço ou tabulação.

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 encontrar as linhas que contêm apenas caracteres alfanuméricos e, em seguida, negue isso com o NOT operador.
SELECT c1 FROM t1 
WHERE c1 NOT REGEXP '[[:alnum:]]';

Resultado:
+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
+----------------------+

Se você precisar excluir um caractere específico, sempre poderá usar o NULLIF() função.

Por exemplo, vamos excluir a string vazia da última linha:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

Resultado:
+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
+----------------------+

Opção 2:especificar um intervalo de caracteres


Outra maneira de fazer isso é especificar um intervalo de caracteres em sua expressão regular.

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

Resultado:
+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
| é                    |
| É                    |
| ø                    |
+----------------------+

E para remover a string vazia:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';

Resultado:
+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| é                    |
| É                    |
| ø                    |
+----------------------+

Nesse caso, meu intervalo de exclusão não abrangeu caracteres alfanuméricos como é , É , e ø e, portanto, a saída não é uma representação verdadeira de caracteres não alfanuméricos. Dito isso, pelo menos esse método oferece a opção de especificar os caracteres exatos que você deseja incluir ou excluir do resultado.

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 NOT RLIKE ou NOT REGEXP_LIKE() .

Exemplo de RLIKE :
SELECT c1 FROM t1 
WHERE c1 NOT RLIKE '[[:alnum:]]';

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