sql >> Databasteknik >  >> RDS >> Oracle

Hitta alla icke-numeriska värden i en kolumn i Oracle

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

  1. Oracle Sequence genererar inte det kontinuerliga numret

  2. Hur man skriver en lagrad procedur med phpmyadmin och hur man använder den genom php?

  3. Vad är skillnaden mellan REFERENSER med eller utan en UTLÄNDSKNYCKEL

  4. Hur man bestämmer tabellstorlek i Oracle