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