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