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

Localizar todos os valores não numéricos em uma coluna no Oracle


Se você encontrar uma coluna de caracteres que deveria ser uma coluna numérica, sempre há a possibilidade de que ela contenha dados não numéricos que você não conhece.

No Oracle Database, você pode executar uma consulta como a seguinte para retornar dados não numéricos da coluna.

Dados de amostra


Vamos criar uma tabela de amostra com um VARCHAR2 coluna e inserir dados:
DROP TABLE t1;
CREATE TABLE t1 (
    c1 varchar2(255)
);
INSERT ALL 
INTO t1 (c1) VALUES ('0')
INTO t1 (c1) VALUES ('1')
INTO t1 (c1) VALUES ('+1')
INTO t1 (c1) VALUES ('-1')
INTO t1 (c1) VALUES ('00.00')
INTO t1 (c1) VALUES ('73.45')
INTO t1 (c1) VALUES ('+73.45')
INTO t1 (c1) VALUES ('-73.45')
INTO t1 (c1) VALUES ('.246')
INTO t1 (c1) VALUES ('-.34e7')
INTO t1 (c1) VALUES ('12.e-3')
INTO t1 (c1) VALUES ('1.2e+4')
INTO t1 (c1) VALUES ('a')
INTO t1 (c1) VALUES ('9afc')
INTO t1 (c1) VALUES ('e7')
INTO t1 (c1) VALUES ('+e0')
INTO t1 (c1) VALUES ('Ten')
INTO t1 (c1) VALUES ('5 Dollars')
SELECT 1 FROM DUAL;

Veja o que a tabela contém:
SELECT * FROM t1;

Resultado:
0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
a
9afc
e7
+e0
Ten
5 Dollars

A coluna é um varchar(255) coluna, então não é numérico. Ele pode (e contém) números, mas estes são armazenados como dados de caracteres. Ele também pode conter texto arbitrário (o que ele faz).

Retornar todos os valores não numéricos


Podemos usar a seguinte consulta para retornar valores não numéricos da tabela acima:
SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');

Resultado:
12.e-3
a
9afc
e7
+e0
Ten
5 Dollars

Retornar números não inteiros


Se quisermos apenas retornar não inteiros, a consulta pode ser muito mais simples:
SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');

Resultado:
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
a
9afc
e7
+e0
Ten
5 Dollars

Observe que este exemplo também exclui inteiros com sinal.

Não contém dados numéricos


Se quisermos apenas encontrar linhas que não contenham dados numéricos, podemos fazer o seguinte:
SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');

Resultado:
a
Ten

Alternativamente, podemos usar classes POSIX para obter o mesmo resultado:
SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');

Resultado:
a
Ten