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

Renvoyer uniquement des valeurs numériques dans MySQL

La requête MySQL suivante renvoie uniquement les lignes qui ont des valeurs numériques dans une colonne donnée.

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'),
    ('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 table est maintenant créée et contient les données suivantes :

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

Nous pouvons utiliser la requête suivante pour renvoyer toutes les valeurs numériques du tableau ci-dessus :

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

Résultat :

+--------+
| c1     |
+--------+
| 0      |
| 1      |
| +1     |
| -1     |
| 00.00  |
| 73.45  |
| +73.45 |
| -73.45 |
| .246   |
| -.34e7 |
| 1.2e+4 |
| e7     |
| +e0    |
+--------+

Ici, nous avons utilisé le REGEXP fonction pour faire correspondre uniquement les valeurs qui correspondent à notre modèle spécifié.

Renvoyer des entiers

Si nous ne voulons renvoyer que des entiers, le modèle peut être beaucoup plus simple :

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

Résultat :

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

Contient des données numériques

Si nous voulons trouver des lignes qui ne font que contenir données numériques (même si elles contiennent également des données non numériques), nous pouvons faire ce qui suit :

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

Résultat :

+-----------+
| 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 caractères POSIX

MySQL prend en charge les classes de caractères POSIX, ce qui signifie que nous pouvons utiliser [:digit:] au lieu de [0-9] dans nos expressions régulières.

Exemple :

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

Qui est l'équivalent de ce qui suit :

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