Následující dotaz MySQL vrátí pouze ty řádky, které mají v daném sloupci číselné hodnoty.
Ukázková data
Předpokládejme, že vytvoříme tabulku takto:
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;
Tabulka byla nyní vytvořena a obsahuje následující údaje:
+-----------+ | 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 | +-----------+
Sloupec je varchar(255)
sloupec, takže není číselný. Může (a obsahuje) čísla, ale ty jsou uloženy jako znaková data. Může také obsahovat libovolný text (což obsahuje).
Vrátit všechny číselné hodnoty
K vrácení všech číselných hodnot z výše uvedené tabulky můžeme použít následující dotaz:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Výsledek:
+--------+ | c1 | +--------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 1.2e+4 | | e7 | | +e0 | +--------+
Zde jsme použili REGEXP
funkce, aby odpovídala pouze hodnotám, které odpovídají našemu zadanému vzoru.
Vrátit celá čísla
Pokud chceme vrátit pouze celá čísla, vzor může být mnohem jednodušší:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Výsledek:
+------+ | c1 | +------+ | 0 | | 1 | +------+
Obsahuje číselná data
Pokud chceme najít řádky, které pouze obsahují číselné údaje (i když obsahují i nečíselné údaje), můžeme provést následující:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Výsledek:
+-----------+ | 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 | +-----------+
Třídy znaků POSIX
MySQL podporuje znakové třídy POSIX, což znamená, že můžeme použít [:digit:]
místo [0-9]
v našich regulárních výrazech.
Příklad:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[[:digit:]]?$';
Což je ekvivalent následujícího:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]?$';