Posteado por: alfayate | julio 16, 2010

Trucos Oracle: Comprobar si un campo es numérico

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.

Anuncios

Responses

  1. impecable! Gracias!

  2. otra solución sería:

    select * from XXXX where LENGTH(TRIM(TRANSLATE(CAMPO , ‘ +-.0123456789′,’ ‘))) >= 1;

    saludos

    • Hola huguin. Gracias por aportar tu solución. Efectivamente, también es válida, aunque yo le haría dos puntualizaciones:

      La primera, es del rendimiento. Si tienes que comprobar sólo unos cuantos registros (o hacer un cierto número de comprobaciones, si estamos hablando de una función) pues no importa demasiado, pero si te toca hacerlo con cientos de miles (como me pasó a mí recientemente) la cosa cambia (Véase también el post sobre NOT IN). En este caso para cada registro llamamos a tres funciones y hacemos una comparación, mientras que con la solución original llamamos a una función y hacemos una comparación.

      La otra es más bien de tipo estético. Yo, personalmente, si no hay una razón de peso para lo contrario (como el rendimiento del que hablábamos antes) prefiero siempre el código cuanto más corto y legible mejor, porque el ordenador se encarga de ejecutarlo, pero seguramente te toque a tí revisarlo y modificarlo… En la misma línea prefiero usar un carácter comodín para el TRANSLATE (como la ‘T’) porque un espacio en blanco tiende a ser confuso y a pasarse por alto.

      Espero que estas consideraciones te sean de ayuda. Saludos

  3. […] https://stoneheads.wordpress.com/2010/07/16/trucos-oracle-comprobar-si-un-campo-es-numerico/ […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: