sql >> Database >  >> RDS >> Oracle

Retourrijen die numerieke waarden bevatten in Oracle

De volgende voorbeelden retourneren alleen die rijen met numerieke waarden in een bepaalde kolom in Oracle Database.

Deze voorbeelden gebruiken de REGEXP_LIKE functie om waarden te retourneren die overeenkomen met het opgegeven patroon.

Voorbeeldgegevens

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

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;

Laten we alle gegevens uit de tabel selecteren:

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 varchar2 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 numerieke waarden retourneren

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

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

Resultaat:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
1.2e+4

Gehele getallen retourneren

Als we alleen gehele getallen willen retourneren, kan de query een stuk eenvoudiger zijn:

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

Resultaat:

0
1

Bevat numerieke gegevens

Als we rijen willen vinden die bevatten numerieke gegevens (zelfs als ze ook niet-numerieke gegevens bevatten), kunnen we het volgende doen:

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

Resultaat:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
9afc
e7
+e0
5 Dollars

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

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

Resultaat:

0
1
+1
-1
00.00
73.45
+73.45
-73.45
.246
-.34e7
12.e-3
1.2e+4
9afc
e7
+e0
5 Dollars

  1. Updaten van MYSQL naar MYSQLI

  2. MySQL SELECT afgelopen dagen?

  3. Wat is er mis met deze PL/SQL? Bindvariabele * is NIET VERKLAARD

  4. Converteer maandnummer naar maandnaamfunctie in SQL