Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Retornar apenas valores numéricos no MySQL


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]?$';