web-dev-qa-db-fra.com

Meilleur équivalent pour IsInteger dans SQL Server

Quel est le meilleur moyen de déterminer si la valeur d'un champ est un entier dans SQL Server (2000/2005/2008)?

IsNumeric renvoie true pour une variété de formats qui ne seraient probablement pas convertis en un entier. Les exemples incluent «15 000» et «15,1».

Vous pouvez utiliser une instruction similaire, mais cela ne semble fonctionner que pour les champs ayant un nombre prédéterminé de chiffres ...

select * where zipcode like '[0-9][0-9][0-9][0-9][0-9]'

Je pourrais écrire une fonction définie par l'utilisateur qui tente de convertir un paramètre varchar en un entier dans un bloc try/catch, mais je vérifie auprès de la communauté si quelqu'un a déjà rencontré des méthodes permettant d'atteindre cet objectif, de préférence être utilisé dans la clause where d'une instruction SQL sans créer d'autres objets.

28
Mayo

1 approche est

zipcode NOT LIKE '%[^0-9]%'

Doubles négatifs, faut les aimer!

35
AdaTheDev

Entrée tardive avec traitement négatif

ISNUMERIC(zipcode + '.0e0') --integer
ISNUMERIC(zipcode + 'e0')  --decimal

Pour plus voir this

52
gbn
6
OMG Ponies

Cette expression donne 1 pour une valeur entière et 0 sinon

floor((floor(abs(zipcode)))/abs(zipcode))
4
george

Je l’ai fait en utilisant une instruction Case: int)

0
Todd181

Pourquoi ne pas simplement utiliser ce qui suit? Je ne peux pas voir pour trouver des cas où il échoue.

  • 1 = entier
  • 0 = pas entier
  • null = non numérique
DECLARE @TestValue nvarchar(MAX)
SET @TestValue = '1.04343234e5'

SELECT CASE WHEN ISNUMERIC(@TestValue) = 1
        THEN CASE WHEN ROUND(@TestValue,0,1) = @TestValue
            THEN 1
            ELSE 0
            END
        ELSE null
        END AS Analysis
0
cjbarth

Voir si le code ci-dessous aidera . Dans les valeurs ci-dessous, seuls 9, 2147483647, 1234567 sont éligibles en tant que. Entier. Nous pouvons créer cela en tant que fonction et l'utiliser.

CREATE TABLE MY_TABLE(MY_FIELD VARCHAR(50))
INSERT INTO MY_TABLE
VALUES('9.123'),('1234567'),('9'),('2147483647'),('2147483647.01'),('2147483648'), ('2147483648ABCD'),('214,7483,648')

SELECT *
FROM MY_TABLE
WHERE CHARINDEX('.',MY_FIELD) = 0 AND CHARINDEX(',',MY_FIELD) = 0       
AND ISNUMERIC(MY_FIELD) = 1 AND CONVERT(FLOAT,MY_FIELD) / 2147483647 <= 1
DROP TABLE MY_TABLE
0
Gopakumar N.Kurup

Après avoir migré vers SQL 2008, je me débattais avec isnumeric ('\ 8') renvoyant true, mais émettant une erreur lors de la conversion en un entier. Apparemment, la barre oblique est une devise valable pour le yen ou le won - (référence http://www.louiebao.net/blog/200910/isnumeric/ )

Ma solution était

case when ISNUMERIC(@str) > 0 and not rtrim(@str) LIKE '[^0-9]%'  and not rtrim(@str) LIKE '%[^0-9]' and not rtrim(@str) LIKE '[^0-9]%' then rtrim(@str) else null end
0
jessieloo

Pour tester si la valeur d'entrée est un entier ou non, nous pouvons utiliser SQL_VARIANT_PROPERTY function de SQL SERVER. 

Le script SQL suivant prendra en entrée et le testera si le type de données s'avère être un entier ou non

declare @convertedTempValue bigint, @inputValue nvarchar(255) = '1' --Change '1' to any input value
set @convertedTempValue = TRY_PARSE(@inputValue as bigint) --we trying to convert to bigint
declare @var3 nvarchar(255) = cast (SQL_VARIANT_PROPERTY(@convertedTempValue,'BaseType') as nvarchar(255)) --we using SQL_VARIANT_PROPERTY to find out datatype
if ( @var3 like '%int%')
    begin
    print 'value is integer'
    end
else
    begin
    print 'value is non integer'
    end
go
0
vibs2006

Je suis venu avec la réponse parfaite pour cela sur une autre question StackO .
Cela prouve également que vous ne pouvez pas utiliser ".0e0" comme le suggère un utilisateur, ici .
Il le fait sans fonctions CLR ni fonctions non scalaires .
S'il vous plaît vérifier: https://stackoverflow.com/a/10645764/555798

0
MikeTeeVee