In MySQL, puoi eseguire una query come la seguente per restituire dati non numerici dalla colonna.
Questo può essere utile se trovi mai una colonna che contiene dati numerici, ma è stata impostata come varchar
o char
colonna. È possibile utilizzare questa query per trovare eventuali valori non numerici che potrebbero essere stati inseriti nella colonna. Puoi quindi gestirlo come preferisci, ad esempio convertirli in numerici, quindi modificare il tipo di 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'),
('.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;
La tabella è stata creata e contiene le seguenti righe:
+-----------+ | 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 colonna è un varchar(255)
colonna, quindi non è numerico. Può (e contiene) numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).
Restituisci tutti i valori non numerici
Possiamo utilizzare la seguente query per restituire valori non numerici dalla tabella precedente:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Risultato:
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Restituisce non interi
Se vogliamo restituire solo numeri non interi, la query può essere molto più semplice:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Risultato:
+-----------+ | 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 | +-----------+
Non contiene dati numerici
Se vogliamo solo trovare righe che non contengono dati numerici, possiamo fare quanto segue:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Risultato:
+------+ | c1 | +------+ | a | | Ten | +------+