Wenn Sie jemals auf eine Zeichenspalte stoßen, die eine numerische Spalte sein sollte, besteht immer die Möglichkeit, dass sie nicht numerische Daten enthält, von denen Sie nichts wissen.
In Oracle Database können Sie eine Abfrage wie die folgende ausführen, um nicht numerische Daten aus der Spalte zurückzugeben.
Beispieldaten
Lassen Sie uns eine Beispieltabelle mit einem VARCHAR2
erstellen Spalte und Daten einfügen:
DROP TABLE t1;
CREATE TABLE t1 (
c1 varchar2(255)
);
INSERT ALL
INTO t1 (c1) VALUES ('0')
INTO t1 (c1) VALUES ('1')
INTO t1 (c1) VALUES ('+1')
INTO t1 (c1) VALUES ('-1')
INTO t1 (c1) VALUES ('00.00')
INTO t1 (c1) VALUES ('73.45')
INTO t1 (c1) VALUES ('+73.45')
INTO t1 (c1) VALUES ('-73.45')
INTO t1 (c1) VALUES ('.246')
INTO t1 (c1) VALUES ('-.34e7')
INTO t1 (c1) VALUES ('12.e-3')
INTO t1 (c1) VALUES ('1.2e+4')
INTO t1 (c1) VALUES ('a')
INTO t1 (c1) VALUES ('9afc')
INTO t1 (c1) VALUES ('e7')
INTO t1 (c1) VALUES ('+e0')
INTO t1 (c1) VALUES ('Ten')
INTO t1 (c1) VALUES ('5 Dollars')
SELECT 1 FROM DUAL;
Folgendes enthält die Tabelle:
SELECT * FROM t1;
Ergebnis:
0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Ten 5 Dollars
Die Spalte ist ein varchar(255)
Spalte, also nicht numerisch. Es kann (und tut) Zahlen enthalten, aber diese werden als Zeichendaten gespeichert. Es kann auch beliebigen Text enthalten (was es auch tut).
Alle nicht-numerischen Werte zurückgeben
Wir können die folgende Abfrage verwenden, um nicht numerische Werte aus der obigen Tabelle zurückzugeben:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');
Ergebnis:
12.e-3 a 9afc e7 +e0 Ten 5 Dollars
Nicht-Ganzzahlen zurückgeben
Wenn wir nur Nicht-Ganzzahlen zurückgeben wollen, kann die Abfrage viel einfacher sein:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');
Ergebnis:
+1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Ten 5 Dollars
Beachten Sie, dass dieses Beispiel auch ganze Zahlen mit Vorzeichen ausschließt.
Enthält keine numerischen Daten
Wenn wir nur Zeilen finden möchten, die keine numerischen Daten enthalten, können wir Folgendes tun:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');
Ergebnis:
a Ten
Wir können alternativ POSIX-Klassen verwenden, um dasselbe Ergebnis zu erhalten:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');
Ergebnis:
a Ten