Poniższe przykłady MariaDB zwracają tylko te wiersze, które mają wartości liczbowe w danej kolumnie.
W tych przykładach użyto REGEXP
funkcja zwracająca wartości pasujące do określonego wzorca.
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 | +--------+
Zwracane liczby całkowite
Jeśli chcemy zwrócić tylko liczby całkowite, zapytanie może być dużo prostsze:
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
MariaDB 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:]]?$';
Wynik:
+------+ | c1 | +------+ | 0 | | 1 | +------+