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

Rechercher toutes les valeurs non numériques dans une colonne dans Oracle

Si jamais vous rencontrez une colonne de caractères qui devrait être une colonne numérique, il est toujours possible qu'elle contienne des données non numériques que vous ne connaissez pas.

Dans Oracle Database, vous pouvez exécuter une requête comme celle-ci pour renvoyer des données non numériques à partir de la colonne.

Exemple de données

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

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;

Voici ce que contient le 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 varchar(255) 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 non numériques

Nous pouvons utiliser la requête suivante pour renvoyer des valeurs non numériques à partir du tableau ci-dessus :

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

Résultat :

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

Renvoyer des nombres non entiers

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

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

Résultat :

+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

Notez que cet exemple exclut également les entiers signés.

Ne contient pas de données numériques

Si nous voulons simplement trouver des lignes qui ne contiennent aucune donnée numérique, nous pouvons procéder comme suit :

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

Résultat :

a
Ten

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

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

Résultat :

a
Ten