Als u ooit een tekenkolom tegenkomt die een numerieke kolom zou moeten zijn, is er altijd een mogelijkheid dat deze niet-numerieke gegevens bevat waarvan u niets af weet.
In MariaDB kunt u een query als de volgende uitvoeren om niet-numerieke gegevens uit de kolom te retourneren.
Voorbeeldgegevens
Stel dat we een tabel als volgt maken:
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;
Dat SELECT
verklaring aan het einde resulteert in dit:
+-----------+ | 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 | +-----------+
De kolom is een varchar(255)
kolom, dus het is niet numeriek. Het kan (en zal) cijfers bevatten, maar deze worden opgeslagen als tekengegevens. Het kan ook willekeurige tekst bevatten (wat het ook doet).
Alle niet-numerieke waarden retourneren
We kunnen de volgende query gebruiken om niet-numerieke waarden uit de bovenstaande tabel te retourneren:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultaat:
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Return niet-integers
Als we alleen niet-gehele getallen willen retourneren, kan de zoekopdracht een stuk eenvoudiger zijn:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Resultaat:
+-----------+ | c1 | +-----------+ | +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 | +-----------+
Bevat geen numerieke gegevens
Als we alleen rijen willen vinden die geen numerieke gegevens bevatten, kunnen we het volgende doen:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultaat:
+------+ | c1 | +------+ | a | | Ten | +------+
We kunnen een POSIX-klasse gebruiken om hetzelfde resultaat te krijgen:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Resultaat:
+------+ | c1 | +------+ | a | | Ten | +------+