sql >> Database >  >> RDS >> Oracle

Vind alle niet-numerieke waarden in een kolom in Oracle

Als u ooit een tekenkolom tegenkomt die een numerieke kolom zou moeten zijn, is er altijd een mogelijkheid dat deze niet-numerieke gegevens bevat waarvan u niets af weet.

In Oracle Database kunt u een query uitvoeren zoals de volgende om niet-numerieke gegevens uit de kolom te retourneren.

Voorbeeldgegevens

Laten we een voorbeeldtabel maken met een VARCHAR2 kolom en gegevens invoegen:

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;

Dit is wat de tabel bevat:

SELECT * FROM t1;

Resultaat:

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

De kolom is een varchar(255) kolom, dus het is niet numeriek. Het kan (en zal) cijfers bevatten, maar deze worden opgeslagen als tekengegevens. Het kan ook willekeurige tekst bevatten (wat het ook doet).

Alle niet-numerieke waarden retourneren

We kunnen de volgende query gebruiken om niet-numerieke waarden uit de bovenstaande tabel te retourneren:

SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');

Resultaat:

12.e-3
a
9afc
e7
+e0
Ten
5 Dollars

Return niet-integers

Als we alleen niet-gehele getallen willen retourneren, kan de zoekopdracht een stuk eenvoudiger zijn:

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

Resultaat:

+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

Merk op dat dit voorbeeld ook gehele getallen met een teken uitsluit.

Bevat geen numerieke gegevens

Als we alleen rijen willen vinden die geen numerieke gegevens bevatten, kunnen we het volgende doen:

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

Resultaat:

a
Ten

We kunnen ook POSIX-klassen gebruiken om hetzelfde resultaat te krijgen:

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

Resultaat:

a
Ten

  1. Alle uitgeschakelde beperkingen in SQL Server retourneren (T-SQL-voorbeeld)

  2. Een gekoppelde server beperken tot een enkele lokale aanmelding (T-SQL-voorbeeld)

  3. Is het in SQL OK dat twee tabellen naar elkaar verwijzen?

  4. Maak customer business intelligence mogelijk via gegevenscatalogi, zakelijke woordenlijsten en gegevensbeheer