W MySQL możesz uruchomić zapytanie podobne do poniższego, aby zwrócić dane nieliczbowe z kolumny.
Może to być przydatne, jeśli kiedykolwiek znajdziesz kolumnę zawierającą dane liczbowe, ale została ona skonfigurowana jako varchar
lub char
kolumna. Za pomocą tego zapytania można znaleźć dowolne wartości nieliczbowe, które mogły zostać wstawione do kolumny. Następnie możesz sobie z tym poradzić w dowolny sposób, na przykład przekonwertować je na wartości liczbowe, a następnie zmienić typ 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'),
('.5'),
('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 wiersze:
+-----------+ | c1 | +-----------+ | 0 | | 1 | | +1 | | -1 | | .5 | | 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 | | .5 | | 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 | +------+