sql >> Base de Datos >  >> RDS >> Oracle

Encuentre todos los valores no numéricos en una columna en Oracle

Si alguna vez encuentra una columna de caracteres que debería ser una columna numérica, siempre existe la posibilidad de que contenga datos no numéricos que no conoce.

En Oracle Database, puede ejecutar una consulta como la siguiente para devolver datos no numéricos de la columna.

Datos de muestra

Vamos a crear una tabla de muestra con un VARCHAR2 columna e insertar datos:

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;

Esto es lo que contiene la tabla:

SELECT * FROM t1;

Resultado:

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 columna es un varchar(255) columna, por lo que no es numérico. Puede (y contiene) números, pero estos se almacenan como datos de caracteres. También puede contener texto arbitrario (y lo hace).

Devolver todos los valores no numéricos

Podemos usar la siguiente consulta para devolver valores no numéricos de la tabla anterior:

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

Resultado:

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

Retornar números no enteros

Si solo queremos devolver números no enteros, la consulta puede ser mucho más simple:

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

Resultado:

+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

Tenga en cuenta que este ejemplo también excluye los enteros con signo.

No contiene datos numéricos

Si solo queremos encontrar filas que no contengan datos numéricos, podemos hacer lo siguiente:

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

Resultado:

a
Ten

Alternativamente, podemos usar clases POSIX para obtener el mismo resultado:

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

Resultado:

a
Ten