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 bazie danych Oracle możesz uruchomić zapytanie podobne do poniższego, aby zwrócić dane nieliczbowe z kolumny.
Przykładowe dane
Stwórzmy przykładową tabelę z VARCHAR2
kolumna i wstaw dane:
DROP TABLE t1;
CREATE TABLE t1 (
c1 varchar2(255)
);
INSERT ALL
INTO t1 (c1) VALUES ('0')
INTO t1 (c1) VALUES ('1')
INTO t1 (c1) VALUES ('+1')
INTO t1 (c1) VALUES ('-1')
INTO t1 (c1) VALUES ('00.00')
INTO t1 (c1) VALUES ('73.45')
INTO t1 (c1) VALUES ('+73.45')
INTO t1 (c1) VALUES ('-73.45')
INTO t1 (c1) VALUES ('.246')
INTO t1 (c1) VALUES ('-.34e7')
INTO t1 (c1) VALUES ('12.e-3')
INTO t1 (c1) VALUES ('1.2e+4')
INTO t1 (c1) VALUES ('a')
INTO t1 (c1) VALUES ('9afc')
INTO t1 (c1) VALUES ('e7')
INTO t1 (c1) VALUES ('+e0')
INTO t1 (c1) VALUES ('Ten')
INTO t1 (c1) VALUES ('5 Dollars')
SELECT 1 FROM DUAL;
Oto, co zawiera tabela:
SELECT * FROM t1;
Wynik:
01+1-100.0073.45+73.45-73.45.246-.34e712.e-31.2e+4a9afce7+e0Ten5 dolarów
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 NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');
Wynik:
12.e-3a9afce7+e0Ten5 dolarów
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 NOT REGEXP_LIKE(c1, '^[0-9]+$');
Wynik:
+1-100.0073.45+73.45-73.45.246-.34e712.e-31.2e+4a9afce7+e0Ten5 dolarów
Zauważ, że ten przykład nie obejmuje również liczb całkowitych ze znakiem.
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 NOT REGEXP_LIKE(c1, '[0-9]+');
Wynik:
dziesięć
Możemy alternatywnie użyć klas POSIX, aby uzyskać ten sam wynik:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');
Wynik:
dziesięć