Om du någonsin stöter på en teckenkolumn som borde vara en numerisk kolumn, finns det alltid en möjlighet att den innehåller icke-numeriska data som du inte känner till.
I Oracle Database kan du köra en fråga som följande för att returnera icke-numeriska data från kolumnen.
Exempeldata
Låt oss skapa en exempeltabell med en VARCHAR2
kolumn och infoga data:
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;
Så här innehåller tabellen:
SELECT * FROM t1;
Resultat:
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
Kolumnen är en varchar(255)
kolumn, så den är inte numerisk. Det kan (och innehåller) siffror men dessa lagras som teckendata. Den kan också innehålla godtycklig text (vilket den gör).
Returnera alla icke-numeriska värden
Vi kan använda följande fråga för att returnera icke-numeriska värden från tabellen ovan:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');
Resultat:
12.e-3 a 9afc e7 +e0 Ten 5 Dollars
Returnera icke-heltal
Om vi bara vill returnera icke-heltal kan frågan vara mycket enklare:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');
Resultat:
+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
Observera att det här exemplet också exkluderar heltal med tecken.
Innehåller inte numerisk data
Om vi bara vill hitta rader som inte innehåller några numeriska data kan vi göra följande:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');
Resultat:
a Ten
Vi kan alternativt använda POSIX-klasser för att få samma resultat:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');
Resultat:
a Ten