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