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

Retornar linhas que contêm valores numéricos no Oracle


Os exemplos a seguir retornam apenas as linhas que possuem valores numéricos em uma determinada coluna no Oracle Database.

Esses exemplos usam o REGEXP_LIKE função para retornar valores que correspondam ao padrão especificado.

Dados de amostra


Vamos criar uma tabela de amostra com um varchar2 coluna e inserir dados:
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;

Vamos selecionar todos os dados da tabela:
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 varchar2 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 numéricos


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

Resultado:
0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
1.2e+4

Retornar inteiros


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

Resultado:
0
1

Contém dados numéricos


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

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

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

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