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

Cómo encontrar valores no numéricos en una columna en MySQL

En MySQL, puede ejecutar una consulta como la siguiente para devolver datos no numéricos de la columna.

Esto puede ser útil si alguna vez encuentra una columna que contiene datos numéricos, pero se configuró como varchar o char columna. Puede usar esta consulta para buscar cualquier valor no numérico que se haya insertado en la columna. Luego puede manejarlo de la forma que desee, como convertirlos a numéricos y luego cambiar el tipo de 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'),
    ('.5'),
    ('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 ha sido creada y contiene las siguientes filas:

+-----------+
| c1        |
+-----------+
| 0         |
| 1         |
| +1        |
| -1        |
| .5        |
| 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 |
+-----------+

Devolver 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        |
| .5        |
| 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  |
+------+