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]#&()–[{}]:;',?/* `~$^+=<>“