Mysql
 sql >> Database >  >> RDS >> Mysql

Restituisce solo valori numerici in MySQL

La seguente query MySQL restituisce solo quelle righe che hanno valori numerici in una determinata colonna.

Dati di esempio

Supponiamo di creare una tabella come questa:

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 tabella è stata ora creata e contiene i seguenti dati:

+-----------+
| 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 colonna è un varchar(255) colonna, quindi non è numerico. Può (e lo fa) contenere numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).

Restituisci tutti i valori numerici

Possiamo utilizzare la seguente query per restituire tutti i valori numerici dalla tabella sopra:

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

Risultato:

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

Qui abbiamo usato il REGEXP funzione per abbinare solo i valori che corrispondono al nostro modello specificato.

Restituisce numeri interi

Se vogliamo restituire solo numeri interi, il modello può essere molto più semplice:

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

Risultato:

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

Contiene dati numerici

Se vogliamo trovare righe che semplicemente contengono dati numerici (anche se contengono anche dati non numerici), possiamo fare quanto segue:

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

Risultato:

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

Classi di caratteri POSIX

MySQL supporta le classi di caratteri POSIX, il che significa che possiamo usare [:digit:] invece di [0-9] nelle nostre espressioni regolari.

Esempio:

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

Che è l'equivalente di quanto segue:

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