Die folgenden SQLite-Beispiele geben nur die Zeilen zurück, die nicht numerische Werte in einer bestimmten Spalte enthalten.
Beispieldaten
Lassen Sie uns eine Tabelle mit Beispieldaten erstellen:
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;
Die Tabelle ist nun erstellt und enthält folgende Daten:
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 verwendet ein dynamisches Typsystem, bei dem der Datentyp eines Werts mit dem Wert selbst verknüpft ist, nicht mit der Spalte (wie bei den meisten anderen RDBMS). Als ich die Tabelle erstellt habe, habe ich keinen Datentyp angegeben. Daher können die Werte von jedem Typ sein.
Der Typeof()
Funktion
Wir können die typeof()-Funktion von SQLite verwenden, um numerische Typen auszuschließen (real
und integer
) nicht in der Abfrage zurückgegeben werden:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Ergebnis:
c1 --------- Ten 5 Dollars
Hier ist ein weiteres Beispiel, das den Datentyp für jede Zeile ausgibt:
SELECT
c1,
typeof(c1)
FROM t1;
Ergebnis:
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
Dies zeigt uns, dass nur die letzten beiden Zeilen nicht-numerische Daten enthalten (sie enthalten text
Daten).
Der REGEXP
Funktion
Eine weitere Option ist die Verwendung von REGEXP
um einen regulären Ausdruck zu übergeben, um nur die Werte zurückzugeben, die dem gegebenen Muster entsprechen.
Beispiel:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Ergebnis:
c1 --------- Ten 5 Dollars
Nicht-Ganzzahlen zurückgeben
Wenn wir nur Nicht-Ganzzahlen zurückgeben möchten, können wir Folgendes tun:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Ergebnis:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Dies schließt auch vorzeichenbehaftete Ganzzahlen aus.
Oder wir könnten einen regulären Ausdruck verwenden, wenn unsere Anforderungen spezifischer sind:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Ergebnis:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Enthält keine numerischen Daten
Wenn wir Zeilen finden möchten, die keine numerischen Daten enthalten, können wir Folgendes tun:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Ergebnis:
c1 --- Ten