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

Restituisce righe che contengono valori numerici in Oracle

Gli esempi seguenti restituiscono solo le righe che hanno valori numerici in una determinata colonna in Oracle Database.

Questi esempi utilizzano il REGEXP_LIKE funzione per restituire valori che corrispondono al modello specificato.

Dati di esempio

Creiamo una tabella di esempio con un varchar2 colonna e inserire i dati:

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;

Selezioniamo tutti i dati dalla 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 varchar2 colonna, quindi non è numerico. Può (e lo fa) contenere numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).

Restituisci tutti i valori numerici

Possiamo utilizzare la seguente query per restituire tutti i valori numerici dalla tabella sopra:

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

Risultato:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
1.2e+4

Restituisce numeri interi

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

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

Risultato:

0
1

Contiene dati numerici

Se vogliamo trovare righe che contengono dati numerici (anche se contengono anche dati non numerici), possiamo fare quanto segue:

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

Risultato:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
9afc
e7
+e0
5 Dollars

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

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

Risultato:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
9afc
e7
+e0
5 Dollars