Om du någonsin stöter på en teckenkolumn som borde vara en numerisk kolumn, finns det alltid en möjlighet att den innehåller icke-numeriska data som du inte känner till.
I MariaDB kan du köra en fråga som följande för att returnera icke-numeriska data från kolumnen.
Exempeldata
Anta att vi skapar en tabell så här:
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;
Den där SELECT
uttalande i slutet resulterar i detta:
+-----------+ | 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 | +-----------+
Kolumnen är en varchar(255)
kolumn, så den är inte numerisk. Det kan (och innehåller) siffror men dessa lagras som teckendata. Den kan också innehålla godtycklig text (vilket den gör).
Returnera alla icke-numeriska värden
Vi kan använda följande fråga för att returnera icke-numeriska värden från tabellen ovan:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultat:
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Returnera icke-heltal
Om vi bara vill returnera icke-heltal kan frågan vara mycket enklare:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Resultat:
+-----------+ | 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 | +-----------+
Innehåller inte numerisk data
Om vi bara vill hitta rader som inte innehåller några numeriska data kan vi göra följande:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultat:
+------+ | c1 | +------+ | a | | Ten | +------+
Vi kan använda en POSIX-klass för att få samma resultat:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Resultat:
+------+ | c1 | +------+ | a | | Ten | +------+