Si jamais vous rencontrez une colonne de caractères qui devrait être une colonne numérique, il est toujours possible qu'elle contienne des données non numériques que vous ne connaissez pas.
Dans MariaDB, vous pouvez exécuter une requête comme celle-ci pour renvoyer des données non numériques à partir de la colonne.
Exemple de données
Supposons que nous créons une table comme celle-ci :
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1 varchar(255)
);
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'),
('a'),
('9afc'),
('e7'),
('+e0'),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
Ce SELECT
déclaration à la fin donne ceci :
+-----------+ | c1 | +-----------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | a | | 9afc | | e7 | | +e0 | | Ten | | 5 Dollars | +-----------+
La colonne est un varchar(255)
colonne, donc ce n'est pas numérique. Il peut contenir (et contient) des nombres, mais ceux-ci sont stockés sous forme de données de caractères. Il peut également contenir du texte arbitraire (ce qu'il fait).
Renvoyer toutes les valeurs non numériques
Nous pouvons utiliser la requête suivante pour renvoyer des valeurs non numériques à partir du tableau ci-dessus :
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Résultat :
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Renvoyer des nombres non entiers
Si nous ne voulons renvoyer que des non entiers, la requête peut être beaucoup plus simple :
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Résultat :
+-----------+ | c1 | +-----------+ | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | a | | 9afc | | e7 | | +e0 | | Ten | | 5 Dollars | +-----------+
Ne contient pas de données numériques
Si nous voulons simplement 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 | +------+ | a | | Ten | +------+
Nous pouvons utiliser une classe POSIX pour obtenir le même résultat :
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Résultat :
+------+ | c1 | +------+ | a | | Ten | +------+