sql >> Base de Datos >  >> RDS >> Mysql

Devolver solo valores numéricos en MySQL

La siguiente consulta de MySQL devuelve solo aquellas filas que tienen valores numéricos en una columna dada.

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;

La tabla ahora se ha creado y contiene los siguientes datos:

+-----------+
| 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 numéricos

Podemos usar la siguiente consulta para devolver todos los valores numéricos de la tabla anterior:

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    |
+--------+

Aquí, usamos el REGEXP función para hacer coincidir solo los valores que coinciden con nuestro patrón especificado.

Devolver enteros

Si solo queremos devolver números enteros, el patrón puede ser mucho más simple:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]+$';

Resultado:

+------+
| c1   |
+------+
| 0    |
| 1    |
+------+

Contiene datos numéricos

Si queremos encontrar filas que simplemente contengan datos numéricos (incluso si también contienen datos no numéricos), podemos hacer lo siguiente:

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 |
+-----------+

Clases de caracteres POSIX

MySQL admite clases de caracteres POSIX, lo que significa que podemos usar [:digit:] en lugar de [0-9] en nuestras expresiones regulares.

Ejemplo:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[[:digit:]]?$';

Que es el equivalente de lo siguiente:

SELECT c1
FROM t1 
WHERE c1 REGEXP '^[0-9]?$';