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

Como encontrar valores não numéricos em uma coluna no MySQL


No MySQL, você pode executar uma consulta como a seguinte para retornar dados não numéricos da coluna.

Isso pode ser útil se você encontrar uma coluna que contém dados numéricos, mas foi configurada como um varchar ou char coluna. Você pode usar essa consulta para localizar quaisquer valores não numéricos que possam ter sido inseridos na coluna. Você pode lidar com isso da maneira que quiser, como convertê-los em numérico e alterar o tipo de 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'),
    ('.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;

A tabela foi criada e contém as seguintes linhas:
+-----------+
| 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 |
+-----------+

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