Only numbers

Un compañero vino a preguntarme si en Teradata existe alguna función para saber si todos los caracteres de una cadena son números.

Aunque existe la conocida función (UDF) CHKNUM()/Is_numeric , ésta permite caracteres no numéricos (puntos, comas, signos +/-), y no es esto lo que buscamos exactamente.

Para ver que en una cadena sólo hay números se puede utilizar oTransalate() (una de mis funciones favoritas en Oracle y también en Teradata) en una construcción como esta:

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT CASE
WHEN CHARACTERS(otranslate(TRIM(COALESCE('123465','')),
                           'a1234567890',
                           'a')) = 0
   THEN 'is only numbers'
   ELSE 'is not only numbers'
END
;

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

-------------------
is only numbers

 BTEQ -- Enter your DBC/SQL request or BTEQ command:
SELECT CASE
WHEN CHARACTERS(otranslate(TRIM(COALESCE('123465-A','')),
                           'a1234567890',
                           'a')) = 0
   THEN 'is only numbers'
   ELSE 'is not only numbers'
END
;

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

-------------------
is not only numbers

La idea es eliminar de la cadena todos los caracteres numéricos y verificar si la longitud (CHARACTERS() es análoga a LENGTH()) es cero o no. Si es cero, todos los caracteres (numéricos) fueron eliminados y, por tanto, la cadena era ‘only numbers’.
Si la longitud no es cero, hay caracteres no numéricos y la cadena era ‘not only numbers’.

Por supuesto, esta construcción se puede utilizar con otros patrones para verificar diferentes formatos y demás… (¡y en Oracle también funciona!)

Una última cosa: Se necesita la ‘a’ en la segunda y tercera cadenas para evitar que oTranslate() devuelva NULL .

Saludos.

Carlos.

3 respuestas a Only numbers

  1. Óscar de la Torre dice:

    Yo la verdad es que me pierdo pero, con la introducción de las expresiones regulares, en Oracle se pueden hacer auténticas barbaridades en cuanto a comprobaciones a partir de la 10g.

  2. Maria Romana dice:

    Sorry I can’t comment in Spanish🙂, but I wanted to say thanks for the solution. I found the link on the teradata forums while searching for a way to check that a string is only numeric, and you nailed it!

    Gracias, Maria

  3. Roberto Vega dice:

    Buena tarde Carlos estoy tratando de ejecutar este mismo query ‘otranslate’ en la TD V-13.10 pero marca error, por que en la versión 14.0 no tiene problema?

    SELECT CASE
    WHEN CHARACTERS(otranslate(TRIM(COALESCE(’123465-A’,”)),
    ‘a1234567890′,
    ‘a’)) = 0
    THEN ‘is only numbers’
    ELSE ‘is not only numbers’
    END
    ;

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

A %d blogueros les gusta esto: