sql >> Databasteknik >  >> RDS >> Oracle

Returnera rader som innehåller numeriska värden i Oracle

Följande exempel returnerar endast de rader som har numeriska värden i en given kolumn i Oracle Database.

Dessa exempel använder REGEXP_LIKE funktion för att returnera värden som matchar det angivna mönstret.

Exempeldata

Låt oss skapa en exempeltabell med en varchar2 kolumn och infoga data:

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;

Låt oss välja all data från 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 varchar2 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 numeriska värden

Vi kan använda följande fråga för att returnera alla numeriska värden från tabellen ovan:

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

Resultat:

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

Returnera heltal

Om vi ​​bara vill returnera heltal kan frågan vara mycket enklare:

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

Resultat:

0
1

Innehåller numeriska data

Om vi ​​vill hitta rader som innehåller numeriska data (även om de också innehåller icke-numeriska data), kan vi göra följande:

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

Resultat:

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

Vi kan alternativt använda POSIX-klasser för att få samma resultat:

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

Resultat:

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. PARTITION BY med och utan KEEP i Oracle

  2. #1055 - Uttrycket av SELECT-listan finns inte i GROUP BY-satsen och innehåller en icke-aggregerad kolumn som är inkompatibel med sql_mode=only_full_group_by

  3. Fråga jämföra datum i SQL

  4. SQL - Hitta sats som infogar specifika värden