Si alguna vez encuentra una columna de caracteres que debería ser una columna numérica, siempre existe la posibilidad de que contenga datos no numéricos que no conoce.
En MariaDB, puede ejecutar una consulta como la siguiente para devolver datos no numéricos de la columna.
Datos de muestra
Supongamos que creamos una tabla como esta:
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;
Que SELECT
declaración al final da como resultado esto:
+-----------+ | 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 columna es un varchar(255)
columna, por lo que no es numérico. Puede (y contiene) números, pero estos se almacenan como datos de caracteres. También puede contener texto arbitrario (y lo hace).
Devolver todos los valores no numéricos
Podemos usar la siguiente consulta para devolver valores no numéricos de la tabla anterior:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultado:
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Retornar números no enteros
Si solo queremos devolver números no enteros, la consulta puede ser mucho más simple:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Resultado:
+-----------+ | 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 | +-----------+
No contiene datos numéricos
Si solo queremos encontrar filas que no contengan datos numéricos, podemos hacer lo siguiente:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultado:
+------+ | c1 | +------+ | a | | Ten | +------+
Podemos usar una clase POSIX para obtener el mismo resultado:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Resultado:
+------+ | c1 | +------+ | a | | Ten | +------+