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

2 maneiras de retornar valores não numéricos no SQLite


Os exemplos SQLite a seguir retornam apenas as linhas que possuem valores não 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 

O SQLite usa um sistema de tipo dinâmico, onde o tipo de dados de um valor está associado ao valor em si, 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 excluir tipos numéricos (real e integer ) de ser retornado na consulta:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';

Resultado:
c1       
---------
Ten      
5 Dollars

Aqui está outro 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      

Isso nos mostra que apenas as duas últimas linhas contêm dados não numéricos (elas contêm text dados).

O REGEXP Função


Outra opção é usar 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Resultado:
c1       
---------
Ten      
5 Dollars

Retornar números não inteiros


Se quisermos retornar apenas números não inteiros, podemos fazer o seguinte:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';

Resultado:
c1        
----------
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

Isso também exclui inteiros com sinal.

Ou podemos usar uma expressão regular se nossos requisitos forem mais específicos:
SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[0-9]+$';

Resultado:
c1        
----------
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
Ten       
5 Dollars 

Não contém dados numéricos


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

Resultado:
c1 
---
Ten