Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment trouver des valeurs non numériques dans une colonne dans MySQL

Dans MySQL, vous pouvez exécuter une requête comme celle-ci pour renvoyer des données non numériques à partir de la colonne.

Cela peut être utile si jamais vous trouvez une colonne contenant des données numériques, mais qu'elle a été configurée en tant que varchar ou char colonne. Vous pouvez utiliser cette requête pour rechercher toutes les valeurs non numériques éventuellement insérées dans la colonne. Vous pouvez ensuite les gérer comme bon vous semble, par exemple en les convertissant en numériques, puis en modifiant le type de colonne.

Exemple de données

Supposons que nous créons une table comme celle-ci :

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;

Le tableau a été créé et contient les lignes suivantes :

+-----------+
| 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 colonne est un varchar(255) colonne, donc ce n'est pas numérique. Il peut contenir (et contient) des nombres, mais ceux-ci sont stockés sous forme de données de caractères. Il peut également contenir du texte arbitraire (ce qu'il fait).

Renvoyer toutes les valeurs non numériques

Nous pouvons utiliser la requête suivante pour renvoyer des valeurs non numériques à partir du tableau ci-dessus :

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Résultat :

+-----------+
| c1        |
+-----------+
| 12.e-3    |
| a         |
| 9afc      |
| Ten       |
| 5 Dollars |
+-----------+

Renvoyer des nombres non entiers

Si nous ne voulons renvoyer que des non entiers, la requête peut être beaucoup plus simple :

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

Résultat :

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

Ne contient pas de données numériques

Si nous voulons simplement trouver des lignes qui ne contiennent aucune donnée numérique, nous pouvons procéder comme suit :

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

Résultat :

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+