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]?$';