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

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


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.