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

2 façons de renvoyer des valeurs non numériques dans SQLite

Les exemples SQLite suivants renvoient uniquement les lignes qui ont des valeurs non 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;

La table est maintenant créée 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 exclure les types numériques (real et integer ) d'être renvoyé dans la requête :

SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';

Résultat :

c1       
---------
Ten      
5 Dollars

Voici un autre 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      

Cela nous montre que seules les deux dernières lignes contiennent des données non numériques (elles contiennent du text Les données).

La REGEXP Fonction

Une autre option consiste à 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 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Résultat :

c1       
---------
Ten      
5 Dollars

Renvoyer des nombres non entiers

Si nous ne voulons renvoyer que des nombres non entiers, nous pouvons procéder comme suit :

SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';

Résultat :

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

Cela exclut également les 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 NOT REGEXP '^[0-9]+$';

Résultat :

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

Ne contient pas de données numériques

Si nous voulons trouver des lignes qui ne contiennent aucune donnée numérique, nous pouvons procéder comme suit :

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

Résultat :

c1 
---
Ten