Följande SQLite-exempel returnerar endast de rader som har numeriska värden i en given kolumn.
Exempeldata
Låt oss skapa en tabell med exempeldata:
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;
Tabellen har nu skapats och innehåller följande data:
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 använder ett dynamiskt typsystem, där datatypen för ett värde är associerad med själva värdet, inte kolumnen (som med de flesta andra RDBMS). När jag skapade tabellen angav jag ingen datatyp. Därför kan värdena vara av vilken typ som helst.
Typeof()
Funktion
Vi kan använda SQLites typeof() funktion för att filtrera resultaten till bara numeriska typer (real
och integer
):
SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Resultat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Bara för att vara tydlig, här är ett exempel som matar ut datatypen för varje rad:
SELECT
c1,
typeof(c1)
FROM t1;
Resultat:
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
REGEXP
Funktion
Om vi har mer specifika krav kan vi alternativt använda REGEXP
för att skicka ett reguljärt uttryck för att returnera bara de värden som matchar det givna mönstret.
Exempel:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Returnera heltal
Om vi bara vill returnera heltal kan vi förenkla frågan på följande sätt:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Resultat:
c1 -- 0 1 1 -1
Detta returnerar också signerade heltal.
Eller så kan vi använda ett reguljärt uttryck om våra krav är mer specifika:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Resultat:
c1 -- 0 1 1
Innehåller numeriska data
Om vi vill hitta rader som innehåller numerisk data (även om de också innehåller icke-numeriska data), kan vi göra följande:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Resultat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars