Abaixo estão dois métodos para retornar linhas que contêm apenas caracteres 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. 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 alfanuméricos. SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');
Resultado:
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.
Observe que 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 REGEXP_LIKE(c1, '^[[:alnum:] ]+$');
Resultado:
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 REGEXP_LIKE(c1, '[[:alnum:]]');
Resultado:
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 é especificar um intervalo de caracteres em sua expressão regular.
Exemplo:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');
Resultado:
Music 007
Você notará que isso retornou menos linhas do que com nosso primeiro exemplo. Isso ocorre 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.
Aqui está novamente com um intervalo que inclui esses caracteres:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');
Resultado:
Music Café 007 é É ø
Podemos incluir espaços como este:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');
Resultado:
Music Live Music Café Café Del Mar 100 Cafés Player 456 007 é É é 123 ø ø 123
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 REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');
Resultado:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é É é 123 ø ø 123
Ou se não quisermos incluir esses caracteres unicode, podemos simplificar para isso:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');
Resultado:
Music Live Music Café Café Del Mar 100 Cafés [email protected] 1 + 1 $1.50 Player 456 007 é 123 ø 123
Isso não exclui esses caracteres unicode da saída se eles compartilharem uma linha com caracteres alfanuméricos.