Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Znajdź wszystkie wartości nieliczbowe w kolumnie w Oracle

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ęć

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak upiększyć dane wyjściowe pochodzące z zapytania SELECT w wierszu polecenia?

  2. Jak uzyskać dostęp do bazy danych Oracle w VirtualBox z hosta (Windows)

  3. Metoda gromadzenia:procedura EXTEND w bazie danych Oracle

  4. Parsowanie tnsnames.ora w Visual C# 2008

  5. Kod do wywołania funkcji w pakiecie z C# i ODP.NET