Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

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


Abaixo estão dois métodos para retornar linhas que contêm apenas caracteres não alfanuméricos no Oracle Database.

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 (c1) 
    WITH c AS (
        SELECT 'Music' FROM DUAL UNION ALL
        SELECT 'Live Music' FROM DUAL UNION ALL
        SELECT 'Café' FROM DUAL UNION ALL
        SELECT 'Café Del Mar' FROM DUAL UNION ALL
        SELECT '100 Cafés' FROM DUAL UNION ALL
        SELECT '[email protected]' FROM DUAL UNION ALL
        SELECT '1 + 1' FROM DUAL UNION ALL
        SELECT '()' FROM DUAL UNION ALL
        SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
        SELECT '`~$^+=<>“' FROM DUAL UNION ALL
        SELECT '$1.50' FROM DUAL UNION ALL
        SELECT 'Player 456' FROM DUAL UNION ALL
        SELECT '007' FROM DUAL UNION ALL
        SELECT 'é' FROM DUAL UNION ALL
        SELECT 'É' FROM DUAL UNION ALL
        SELECT 'é 123' FROM DUAL UNION ALL
        SELECT 'ø' FROM DUAL UNION ALL
        SELECT 'ø 123' FROM DUAL)
SELECT * FROM c;

SELECT c1 FROM t1;

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

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


Podemos usar o REGEXP_LIKE() da Oracle função para comparar o valor com uma expressão regular e, em seguida, negá-lo com o NOT operador.

A capacidade de expressão regular do Oracle 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 não alfanuméricos.
SELECT c1 FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');

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

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

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

Aqui está um exemplo de expansão do intervalo para excluir esses caracteres da saída:
SELECT c1 FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

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