Saber si un valor es numérico en Oracle

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.

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.

Deja un comentario

Esta web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está aceptando éstas y nuestra política de las mismas.

ACEPTAR
Aviso de cookies