Следната MySQL заявка връща само онези редове, които имат числови стойности в дадена колона.
Примерни данни
Да предположим, че създаваме таблица като тази:
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;
Таблицата вече е създадена и съдържа следните данни:
+-----------+ | 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 | +-----------+
Колоната е varchar(255)
колона, така че не е числова. Може (и съдържа) числа, но те се съхраняват като данни за знаци. Може също да съдържа произволен текст (което прави).
Връщане на всички числови стойности
Можем да използваме следната заявка, за да върнем всички числови стойности от горната таблица:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Резултат:
+--------+ | c1 | +--------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 1.2e+4 | | e7 | | +e0 | +--------+
Тук използвахме REGEXP
функция, за да съвпада само със стойностите, които съответстват на нашия определен модел.
Връщане на цели числа
Ако искаме да върнем само цели числа, моделът може да бъде много по-прост:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Резултат:
+------+ | c1 | +------+ | 0 | | 1 | +------+
Съдържа числови данни
Ако искаме да намерим редове, които само съдържат числови данни (дори и те да съдържат нечислови данни), можем да направим следното:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Резултат:
+-----------+ | 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 | +-----------+
Символни класове POSIX
MySQL поддържа POSIX символни класове, което означава, че можем да използваме [:digit:]
вместо [0-9]
в нашите регулярни изрази.
Пример:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[[:digit:]]?$';
Което е еквивалентно на следното:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]?$';