A consulta MySQL a seguir retorna apenas as linhas que possuem valores numéricos em uma determinada 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;
A tabela já foi criada e contém os seguintes dados:
+-----------+ | 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 numéricos
Podemos usar a seguinte consulta para retornar todos os valores numéricos da tabela acima:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultado:
+--------+ | c1 | +--------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 1.2e+4 | | e7 | | +e0 | +--------+
Aqui, usamos o
REGEXP
função para corresponder apenas aos valores que correspondem ao nosso padrão especificado. Retornar inteiros
Se quisermos apenas retornar inteiros, o padrão pode ser muito mais simples:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Resultado:
+------+ | c1 | +------+ | 0 | | 1 | +------+
Contém dados numéricos
Se quisermos encontrar linhas que apenas contêm dados numéricos (mesmo que também contenham dados não numéricos), podemos fazer o seguinte:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Resultado:
+-----------+ | c1 | +-----------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 12.e-3 | | 1.2e+4 | | 9afc | | e7 | | +e0 | | 5 Dollars | +-----------+
Classes de caracteres POSIX
MySQL suporta classes de caracteres POSIX, o que significa que podemos usar
[:digit:]
em vez de [0-9]
em nossas expressões regulares. Exemplo:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[[:digit:]]?$';
Que é o equivalente ao seguinte:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]?$';