Oracle
 sql >> Base de données >  >> RDS >> Oracle

Renvoyer des lignes contenant des valeurs numériques dans Oracle

Les exemples suivants renvoient uniquement les lignes qui ont des valeurs numériques dans une colonne donnée dans Oracle Database.

Ces exemples utilisent le REGEXP_LIKE fonction pour renvoyer des valeurs qui correspondent au modèle spécifié.

Exemple de données

Créons un exemple de table avec un varchar2 colonne et insérer des données :

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électionnons toutes les données du tableau :

SELECT * FROM t1;

Résultat :

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

La colonne est un varchar2 colonne, donc ce n'est pas numérique. Il peut contenir (et contient) des nombres, mais ceux-ci sont stockés sous forme de données de caractères. Il peut également contenir du texte arbitraire (ce qu'il fait).

Renvoyer toutes les valeurs numériques

Nous pouvons utiliser la requête suivante pour renvoyer toutes les valeurs numériques du tableau ci-dessus :

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

Résultat :

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

Renvoyer des entiers

Si nous ne voulons renvoyer que des entiers, la requête peut être beaucoup plus simple :

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

Résultat :

0
1

Contient des données numériques

Si nous voulons trouver des lignes qui contiennent données numériques (même si elles contiennent également des données non numériques), nous pouvons faire ce qui suit :

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

Résultat :

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

Nous pouvons alternativement utiliser les classes POSIX pour obtenir le même résultat :

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

Résultat :

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