Poniższe zapytanie MySQL zwraca tylko te wiersze, które mają wartości liczbowe w danej kolumnie.
Przykładowe dane
Załóżmy, że tworzymy taką tabelę:
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;
Tabela została utworzona i zawiera następujące dane:
+-----------+ | 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 | +-----------+
Kolumna to varchar(255)
kolumna, więc nie jest liczbowa. Może (i zawiera) liczby, ale są one przechowywane jako dane znakowe. Może również zawierać dowolny tekst (co robi).
Zwróć wszystkie wartości liczbowe
Możemy użyć następującego zapytania, aby zwrócić wszystkie wartości liczbowe z powyższej tabeli:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Wynik:
+--------+ | c1 | +--------+ | 0 | | 1 | | +1 | | -1 | | 00.00 | | 73.45 | | +73.45 | | -73.45 | | .246 | | -.34e7 | | 1.2e+4 | | e7 | | +e0 | +--------+
Tutaj użyliśmy REGEXP
funkcja, aby dopasować tylko te wartości, które pasują do naszego określonego wzorca.
Zwracane liczby całkowite
Jeśli chcemy zwrócić tylko liczby całkowite, wzorzec może być dużo prostszy:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Wynik:
+------+ | c1 | +------+ | 0 | | 1 | +------+
Zawiera dane liczbowe
Jeśli chcemy znaleźć wiersze, które tylko zawierają dane numeryczne (nawet jeśli zawierają również dane nienumeryczne), możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Wynik:
+-----------+ | 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 | +-----------+
Klasy znaków POSIX
MySQL obsługuje klasy znaków POSIX, co oznacza, że możemy użyć [:digit:]
zamiast [0-9]
w naszych wyrażeniach regularnych.
Przykład:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[[:digit:]]?$';
Co jest odpowiednikiem następującego:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]?$';