PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

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


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

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:
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 !~ do PostgreSQL operador para comparar nossa coluna com uma expressão regular. Usamos este operador quando queremos especificar que o valor não corresponde à 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 nossa expressão regular.
SELECT c1 FROM t1 
WHERE c1 !~ '[[:alnum:]]';

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

A string vazia também é num-numeric e, portanto, esse exemplo retornou a linha que contém a string vazia.

Podemos excluir strings vazias usando NULLIF() :
SELECT c1 FROM t1 
WHERE NULLIF(c1, '') !~ '[[:alnum:]]';

Resultado:
 ()
 [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 !~ '[A-Za-z0-9]';

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

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

Resultado:
 ()
 [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.