En ocasiones, puede ser de utilidad saber si un valor es numérico para aplicarle o no un tratamiento o preprocesado. Puede servir para discriminar a los valores numéricos en una select porque a lo mejor, lo que se quiera hacer con ese valor daría error si el valor no es numérico. Este problema suele aparecer en los campos que almacenan cadenas, como un varchar2, por ejemplo. Actualmente, Oracle no dispone de ninguna función para esto, aunque la verdad es que sería muy útil que la incorporaran y podría ser más eficiente que las funciones que se montan los desarrolladores para hacer esta comprobación.
Para suplir la falta de esta función y conocer si un valor almacenado en un varchar2 puede tratarse como un número, en Oracle hay dos alternativas.
La primera opción, con la función TRANSLATE.
Con esta función, se intercambian los caracteres de la cadena del segundo parámetro por el carácter que esté en la misma posición de la cadena del tercer parámetro. Por lo tanto, la ‘T’ se cambiaría por la ‘T’ y el resto de caracteres (espacio en blanco y números) por nulo, ya que el tercer parámetro sólo tiene un carácter. La ‘T’ es auxiliar y podría ponerse cualquier letra. Si hubiera un ‘T’ la conservaría y por lo tanto no sería nula la cadena y no sería un número.
Con este ejemplo, devolvería los registros cuyo valor en el campo COLUMNA sea numérico, ya que al aplicar la función se traduciría como null.
SELECT * FROM TABLE WHERE TRANSLATE(COLUMNA, 'T 0123456789', 'T') IS NULL AND COLUMNA IS NOT NULL;
Un uso de la función TRANSLATE más completo en ORACLE, sería el siguiente. Aquí se puede ver que también admite como números las cadenas que contengan otros carácteres válidos en un número como puede ser la coma o el signo (+/-). Puede que no interese que admita todos estos caracteres, en cuyo caso habría que eliminar los que no se quieran admitir y quedarse sólo con los caracteres numéricos, por ejemplo.
TRANSLATE(COLUMNA,'T_0123456789 +-.,;:*!¡=/\()%^[]','T') is null
La segunda opción, con la función REGEXP_LIKE.
Otra función que se puede utilizar en la base de datos Oracle para saber si un valor es numérico o no, es REGEXP_LIKE. Esta función busca un patrón en la cadena que concuerde con la expresión regular que se le pasa.
SELECT * FROM TABLA WHERE REGEXP_LIKE (COLUMNA, '^[[:digit:]]+
En este ejemplo, devolvería los registros que sigan el patrón, es decir, los que el valor del campo COLUMNA, esté compuesto sólo por dígitos.
);
En este ejemplo, devolvería los registros que sigan el patrón, es decir, los que el valor del campo COLUMNA, esté compuesto sólo por dígitos.
felicitaciones
Hola,
tengo una tabla CLIENTES que en la columna CUENTAS tiene valores alfanuméricos y esto me está dando errores al generar un fichero.
Se que hay muchos registro así pero no sé como hacer una sentencia para sacar solo los registros que en la columna CUENTA tenga alfanuméricos.