Os exemplos SQLite a seguir retornam apenas as linhas que possuem valores numéricos em uma determinada coluna.
Dados de amostra
Vamos criar uma tabela com dados de exemplo:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1
);
INSERT INTO t1 (c1) VALUES
(0),
(1),
(+1),
(-1),
(00.00),
(73.45),
(+73.45),
(-73.45),
(.246),
(-.34e7),
(12.e-3),
(1.2e+4),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
A tabela já foi criada e contém os seguintes dados:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
SQLite usa um sistema de tipo dinâmico, onde o tipo de dado de um valor está associado ao próprio valor, não à coluna (como na maioria dos outros RDBMSs). Quando criei a tabela, não especifiquei um tipo de dados. Portanto, os valores podem ser de qualquer tipo.
O Typeof()
Função
Podemos usar a função typeof() do SQLite para filtrar os resultados apenas para tipos numéricos (
real
e integer
):SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Resultado:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Só para ficar claro, aqui está um exemplo que gera o tipo de dados para cada linha:
SELECT
c1,
typeof(c1)
FROM t1;
Resultado:
c1 typeof(c1) ---------- ---------- 0 integer 1 integer 1 integer -1 integer 0.0 real 73.45 real 73.45 real -73.45 real 0.246 real -3400000.0 real 0.012 real 12000.0 real Ten text 5 Dollars text
O REGEXP
Função
Se tivermos requisitos mais específicos, podemos usar alternativamente
REGEXP
para passar uma expressão regular para retornar apenas os valores que correspondem ao padrão fornecido. Exemplo:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultado:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Retornar inteiros
Se quisermos apenas retornar inteiros, podemos simplificar a consulta da seguinte forma:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Resultado:
c1 -- 0 1 1 -1
Isso também retorna inteiros com sinal.
Ou podemos usar uma expressão regular se nossos requisitos forem mais específicos:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Resultado:
c1 -- 0 1 1
Contém dados numéricos
Se quisermos encontrar linhas que contenham dados numéricos (mesmo que também contenham dados não numéricos), podemos fazer o seguinte:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Resultado:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars