Saltar al contenido

T-sql: determine si el valor es un número entero

Investigamos por internet y así mostrarte la solución para tu duda, en caso de alguna difcultad déjanos la inquietud y contestaremos con mucho gusto, porque estamos para servirte.

Solución:

Aquí hay una publicación de blog que describe la creación de un IsInteger UDF.

Básicamente, recomienda agregar '.e0' al valor y al uso IsNumeric. De esta forma, todo lo que ya tenía punto decimal ahora tiene dos puntos decimales, provocando IsNumeric ser – estar falsey cualquier cosa ya expresada en notación científica queda invalidada por la e0.

En su artículo ¿Puedo convertir esto string a un entero?, Itzik Ben-Gan proporciona una solución en T-SQL puro y otra que utiliza el CLR.

¿Qué solución debe elegir?

¿Es mejor la solución T-SQL o CLR? La ventaja de usar la solución T-SQL es que no necesita salirse del dominio de la programación T-SQL. Sin embargo, la solución CLR tiene dos ventajas importantes: es más simple y rápida. Cuando probé ambas soluciones en una tabla que tenía 1 000 000 de filas, la solución CLR tardó dos segundos, en lugar de siete segundos (para la solución T-SQL), en ejecutarse en mi computadora portátil. Entonces, la próxima vez que necesite verificar si un determinado string se puede convertir a un número entero, puede incluir la solución T-SQL o CLR que proporcioné en este artículo.

Si solo desea mantener T-SQL, utilice la solución T-SQL pura. Si el rendimiento es más importante que la comodidad, utilice la solución CLR.

La solución T-SQL pura es complicada. Combina la función ISNUMERIC incorporada con la coincidencia de patrones y la conversión para verificar si el string representa un int.

SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
  CASE
    WHEN ISNUMERIC(string) = 0     THEN 0
    WHEN string LIKE '%[^-+ 0-9]%' THEN 0
    WHEN CAST(string AS NUMERIC(38, 0))
      NOT BETWEEN -2147483648. AND 2147483647. THEN 0
    ELSE 1
  END AS is_int
FROM dbo.T1;

La parte T-SQL de la solución CLR es más simple. Llame a la función fn_IsInt tal como llamaría a ISNUMERIC.

SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
  dbo.fn_IsInt(string) AS is_int
FROM dbo.T1;

La parte de C# es simplemente un contenedor para la función de análisis de .NET Int32.TryParse. Esto funciona porque SQL Server int y .NET Int32 son enteros de 32 bits con signo.

using System;
using System.Data.SqlTypes;

public partial class UserDefinedFunctions

    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean fn_IsInt(SqlString s)
    
        if (s.IsNull)
            return SqlBoolean.False;
        else
        
            Int32 i = 0;
            return Int32.TryParse(s.Value, out i);
        
    
;

Lea el artículo de Itzik para obtener una explicación completa de estos ejemplos de código.

Con sqlserver 2005 y versiones posteriores, puede usar clases de caracteres similares a expresiones regulares con el operador LIKE. Mira aquí.

Para comprobar si un string es un entero no negativo (es una secuencia de dígitos decimales) puedes probar que no contiene otros caracteres.

SELECT numstr
  FROM table
 WHERE numstr NOT LIKE '%[^0-9]%'

Nota 1: Esto también devolverá cadenas vacías.

Nota 2: Uso LIKE '%[0-9]%' devolverá cualquier string que contiene al menos un dígito.

ver violín

Si te animas, tienes la libertad de dejar un artículo acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *