I seguenti esempi di SQLite restituiscono solo quelle righe che hanno valori numerici in una determinata colonna.
Dati di esempio
Creiamo una tabella con dati di esempio:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1
);
INSERT INTO t1 (c1) VALUES
(0),
(1),
(+1),
(-1),
(00.00),
(73.45),
(+73.45),
(-73.45),
(.246),
(-.34e7),
(12.e-3),
(1.2e+4),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
La tabella è stata ora creata e contiene i seguenti dati:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
SQLite utilizza un sistema di tipi dinamici, in cui il tipo di dati di un valore è associato al valore stesso, non alla colonna (come con la maggior parte degli altri RDBMS). Quando ho creato la tabella, non ho specificato un tipo di dati. Pertanto, i valori possono essere di qualsiasi tipo.
Il Typeof()
Funzione
Possiamo usare la funzione typeof() di SQLite per filtrare i risultati in solo tipi numerici (real
e integer
):
SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Risultato:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Per essere chiari, ecco un esempio che restituisce il tipo di dati per ogni riga:
SELECT
c1,
typeof(c1)
FROM t1;
Risultato:
c1 typeof(c1) ---------- ---------- 0 integer 1 integer 1 integer -1 integer 0.0 real 73.45 real 73.45 real -73.45 real 0.246 real -3400000.0 real 0.012 real 12000.0 real Ten text 5 Dollars text
Il REGEXP
Funzione
Se abbiamo requisiti più specifici, possiamo in alternativa utilizzare REGEXP
per passare un'espressione regolare per restituire solo quei valori che corrispondono al modello dato.
Esempio:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Risultato:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Restituisce numeri interi
Se vogliamo restituire solo numeri interi, possiamo semplificare la query come segue:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Risultato:
c1 -- 0 1 1 -1
Questo restituisce anche interi con segno.
Oppure potremmo usare un'espressione regolare se i nostri requisiti sono più specifici:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Risultato:
c1 -- 0 1 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 c1 REGEXP '[0-9]+';
Risultato:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars