Følgende SQLite-eksempler returnerer kun de rækker, der har ikke-numeriske værdier i en given kolonne.
Eksempel på data
Lad os oprette en tabel med eksempeldata:
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 er nu oprettet og indeholder følgende 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 bruger et dynamisk type system, hvor datatypen for en værdi er forbundet med selve værdien, ikke kolonnen (som med de fleste andre RDBMS'er). Da jeg oprettede tabellen, specificerede jeg ikke en datatype. Derfor kan værdierne være af enhver type.
Typeof()
Funktion
Vi kan bruge SQLites typeof() funktion til at udelukke numeriske typer (real
og integer
) fra at blive returneret i forespørgslen:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Resultat:
c1 --------- Ten 5 Dollars
Her er et andet eksempel, der udsender datatypen for hver række:
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
Dette viser os, at kun de sidste to rækker indeholder ikke-numeriske data (de indeholder text
data).
REGEXP
Funktion
En anden mulighed er at bruge REGEXP
at sende et regulært udtryk for at returnere kun de værdier, der matcher det givne mønster.
Eksempel:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultat:
c1 --------- Ten 5 Dollars
Returner ikke-heltal
Hvis vi kun ønsker at returnere ikke-heltal, kan vi gøre følgende:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Resultat:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Dette udelukker også signerede heltal.
Eller vi kunne bruge et regulært udtryk, hvis vores krav er mere specifikke:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Resultat:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Indeholder ikke numeriske data
Hvis vi ønsker at finde rækker, der ikke indeholder nogen numeriske data, kan vi gøre følgende:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Resultat:
c1 --- Ten