Oracle
 sql >> Database >  >> RDS >> Oracle

Trova tutti i valori non numerici in una colonna in Oracle

Se mai incontri una colonna di caratteri che dovrebbe essere una colonna numerica, c'è sempre la possibilità che contenga dati non numerici di cui non sei a conoscenza.

In Oracle Database, puoi eseguire una query come la seguente per restituire dati non numerici dalla colonna.

Dati campione

Creiamo una tabella di esempio con un VARCHAR2 colonna e inserisci i dati:

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;

Ecco cosa contiene la tabella:

SELECT * FROM t1;

Risultato:

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

La colonna è un varchar(255) colonna, quindi non è numerico. Può (e contiene) numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).

Restituisci tutti i valori non numerici

Possiamo utilizzare la seguente query per restituire valori non numerici dalla tabella precedente:

SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');

Risultato:

12.e-3
a
9afc
e7
+e0
Ten
5 Dollars

Restituisce non interi

Se vogliamo restituire solo numeri non interi, la query può essere molto più semplice:

SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');

Risultato:

+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

Nota che questo esempio esclude anche gli interi con segno.

Non contiene dati numerici

Se vogliamo solo trovare righe che non contengono dati numerici, possiamo fare quanto segue:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');

Risultato:

a
Ten

In alternativa possiamo utilizzare le classi POSIX per ottenere lo stesso risultato:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');

Risultato:

a
Ten