SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

2 maneiras de retornar apenas os valores numéricos de uma coluna de banco de dados SQLite


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