Jeśli kiedykolwiek napotkasz kolumnę znakową, która powinna być kolumną numeryczną, zawsze istnieje możliwość, że zawiera ona dane nieliczbowe, o których nie wiesz.
W MariaDB możesz uruchomić zapytanie podobne do poniższego, aby zwrócić dane nieliczbowe z kolumny.
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;
Ten SELECT
oświadczenie na końcu daje następujące wyniki:
+-----------+ | 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 nienumeryczne
Możemy użyć następującego zapytania, aby zwrócić wartości nienumeryczne z powyższej tabeli:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Wynik:
+-----------+ | c1 | +-----------+ | 12.e-3 | | a | | 9afc | | Ten | | 5 Dollars | +-----------+
Zwróć liczby niebędące liczbami całkowitymi
Jeśli chcemy zwrócić tylko liczby niecałkowite, zapytanie może być dużo prostsze:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Wynik:
+-----------+ | 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 | +-----------+
Nie zawiera danych liczbowych
Jeśli chcemy tylko znaleźć wiersze, które nie zawierają żadnych danych liczbowych, możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Wynik:
+------+ | c1 | +------+ | a | | Ten | +------+
Możemy użyć klasy POSIX, aby uzyskać ten sam wynik:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[[:digit:]]';
Wynik:
+------+ | c1 | +------+ | a | | Ten | +------+