sábado, 21 de abril de 2012

Comprobar si un campo es numérico [Oracle]

Problema: Tenemos un campo cuyo tipo es alfanumérico, pero que es usado tanto para almacenar valores numéricos como alfabéticos (o sea, letras y números vamos). Queremos hacer una consulta que nos compruebe cuándo en ese campo hay un valor numérico propiamente dicho y cuándo no.


En Oracle, hasta donde yo sé y por lo que he investigado por ahí, no hay una función que nos sirva expresamente para esto, sin embargo sí que podemos hacer algún ‘apaño’. En Internete podemos encontrar varios, pero de todos ellos, el que más me convence por sencillo y efectivo es el sgte:


TRANSLATE(nombre_campo,'T 0123456789','T') is null
Con esta sencilla condición podemos ver si el campo es numérico. La función translate que vemos aquí simplemente comprueba cómo quedaría el campo si le quitásemos todos los dígitos y los espacios que pudiese haber. Si el resultado es igual a null (o sea, que no quedaría nada) entonces es que es un número. La ‘T’ simplemente se usa como carácter auxiliar para que funcione la cosa.

Para los más rigurosos podemos usar esta otra versión extendida en la que además de los dígitos y los espacios en blanco, quitamos cualquier otro carácter susceptible de aparecer en una expresión numérica, tales como signos, puntos, paréntesis, operadores, etc…

TRANSLATE(nombre_campo,'T_0123456789 +-.,;:*!¡=/\()%^[]','T') is null

Como siempre lo más efectivo será pensar un poco y adaptarlo al caso concreto que estemos viendo.

Fuente aquí

No hay comentarios:

Publicar un comentario