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