sql >> Database teknologi >  >> RDS >> Oracle

Find alle ikke-numeriske værdier i en kolonne i Oracle

Hvis du nogensinde støder på en tegnkolonne, der burde være en numerisk kolonne, er der altid en mulighed for, at den indeholder ikke-numeriske data, som du ikke kender til.

I Oracle Database kan du køre en forespørgsel som følgende for at returnere ikke-numeriske data fra kolonnen.

Eksempeldata

Lad os oprette en eksempeltabel med en VARCHAR2 kolonne og indsæt 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;

Her er, hvad tabellen indeholder:

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

Kolonnen er en varchar(255) kolonne, så den er ikke numerisk. Det kan (og gør) indeholde tal, men disse gemmes som tegndata. Den kan også indeholde vilkårlig tekst (hvilket den gør).

Returner alle ikke-numeriske værdier

Vi kan bruge følgende forespørgsel til at returnere ikke-numeriske værdier fra ovenstående tabel:

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

Return ikke-heltal

Hvis vi kun ønsker at returnere ikke-heltal, kan forespørgslen være meget enklere:

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

Bemærk, at dette eksempel også udelukker heltal med fortegn.

Indeholder ikke numeriske data

Hvis vi blot ønsker at finde rækker, der ikke indeholder nogen numeriske data, kan vi gøre følgende:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');

Resultat:

a
Ten

Vi kan alternativt bruge POSIX klasser for at få det samme resultat:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');

Resultat:

a
Ten

  1. Hvordan henter man den aktuelle værdi af en orakelsekvens uden at øge den?

  2. MariaDB og Docker use cases, del 1

  3. OPDATERINGER til statistik

  4. BRUGER-funktion i Oracle