Se você encontrar uma coluna de caracteres que deveria ser uma coluna numérica, sempre há a possibilidade de que ela contenha dados não numéricos que você não conhece.
No MariaDB, você pode executar uma consulta como a seguinte para retornar dados não numéricos da coluna.
Dados de amostra
Suponha que criamos uma tabela assim:
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;
Esse
SELECT
declaração no final resulta nisso:+-----------+ | 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 | +-----------+
A coluna é um
varchar(255)
coluna, então não é numérico. Ele pode (e contém) números, mas estes são armazenados como dados de caracteres. Ele também pode conter texto arbitrário (o que ele faz). Retornar todos os valores não numéricos
Podemos usar a seguinte consulta para retornar valores não numéricos da tabela acima:
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 não inteiros
Se quisermos apenas retornar não inteiros, a consulta pode ser muito mais simples:
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 | +-----------+
Não contém dados numéricos
Se quisermos apenas encontrar linhas que não contenham dados numéricos, podemos fazer o seguinte:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultado:
+------+ | c1 | +------+ | a | | Ten | +------+
Podemos usar uma classe POSIX para obter o mesmo resultado:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Resultado:
+------+ | c1 | +------+ | a | | Ten | +------+