De volgende SQLite-voorbeelden retourneren alleen die rijen met numerieke waarden in een bepaalde kolom.
Voorbeeldgegevens
Laten we een tabel maken met voorbeeldgegevens:
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;
De tabel is nu aangemaakt en bevat de volgende gegevens:
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 gebruikt een dynamisch type systeem, waarbij het datatype van een waarde is gekoppeld aan de waarde zelf, niet aan de kolom (zoals bij de meeste andere RDBMS'en). Toen ik de tabel maakte, heb ik geen gegevenstype opgegeven. Daarom kunnen de waarden van elk type zijn.
Het Typeof()
Functie
We kunnen de functie typeof() van SQLite gebruiken om de resultaten te filteren op alleen numerieke typen (real
en integer
):
SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Resultaat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Voor de duidelijkheid, hier is een voorbeeld dat het gegevenstype voor elke rij uitvoert:
SELECT
c1,
typeof(c1)
FROM t1;
Resultaat:
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
De REGEXP
Functie
Als we meer specifieke vereisten hebben, kunnen we ook REGEXP
. gebruiken om een reguliere expressie door te geven om alleen die waarden te retourneren die overeenkomen met het gegeven patroon.
Voorbeeld:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultaat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Gehele getallen retourneren
Als we alleen gehele getallen willen retourneren, kunnen we de query als volgt vereenvoudigen:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Resultaat:
c1 -- 0 1 1 -1
Dit retourneert ook ondertekende gehele getallen.
Of we kunnen een reguliere expressie gebruiken als onze vereisten specifieker zijn:
SELECT c1
FROM t1
WHERE c1 REGEXP '^[0-9]+$';
Resultaat:
c1 -- 0 1 1
Bevat numerieke gegevens
Als we rijen willen vinden die numerieke gegevens bevatten (zelfs als ze ook niet-numerieke gegevens bevatten), kunnen we het volgende doen:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Resultaat:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars