SQLite
 sql >> Base de données >  >> RDS >> SQLite

2 façons de renvoyer uniquement les valeurs numériques d'une colonne de base de données SQLite

Les exemples SQLite suivants renvoient uniquement les lignes qui ont des valeurs numériques dans une colonne donnée.

Exemple de données

Créons un tableau avec des exemples de données :

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;

Le tableau est maintenant créé et contient les données suivantes :

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 utilise un système de type dynamique, où le type de données d'une valeur est associé à la valeur elle-même, et non à la colonne (comme avec la plupart des autres SGBDR). Lorsque j'ai créé la table, je n'ai pas spécifié de type de données. Par conséquent, les valeurs peuvent être de n'importe quel type.

Le Typeof() Fonction

Nous pouvons utiliser la fonction typeof() de SQLite pour filtrer les résultats uniquement en types numériques (real et integer ):

SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';

Résultat :

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   

Juste pour être clair, voici un exemple qui affiche le type de données pour chaque ligne :

SELECT 
    c1,
    typeof(c1)
FROM t1;

Résultat :

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      

La REGEXP Fonction

Si nous avons des exigences plus spécifiques, nous pouvons également utiliser REGEXP pour passer une expression régulière pour renvoyer uniquement les valeurs qui correspondent au modèle donné.

Exemple :

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Résultat :

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   

Renvoyer des entiers

Si nous ne voulons renvoyer que des entiers, nous pouvons simplifier la requête comme suit :

SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';

Résultat :

c1
--
0 
1 
1 
-1

Cela renvoie également des entiers signés.

Ou nous pourrions utiliser une expression régulière si nos exigences sont plus spécifiques :

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]+$';

Résultat :

c1
--
0 
1 
1 

Contient des données numériques

Si nous voulons trouver des lignes contenant des données numériques (même si elles contiennent également des données non numériques), nous pouvons procéder comme suit :

SELECT c1 
FROM t1 
WHERE c1 REGEXP '[0-9]+';

Résultat :

c1        
----------
0         
1         
1         
-1        
0.0       
73.45     
73.45     
-73.45    
0.246     
-3400000.0
0.012     
12000.0   
5 Dollars