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.
1 approche est
zipcode NOT LIKE '%[^0-9]%'
Doubles négatifs, faut les aimer!
Entrée tardive avec traitement négatif
ISNUMERIC(zipcode + '.0e0') --integer
ISNUMERIC(zipcode + 'e0') --decimal
Pour plus voir this
Si SQL Server 2005+, je activerais le CLR et créerais la fonction prenant en charge les expressions rationnelles . Pour SQL Server 2000, reportez-vous à cet article pour créer un fichier UDF permettant de faire la même chose .
Ensuite, j'utiliserais la regex: ^\d{5}$
Cette expression donne 1 pour une valeur entière et 0 sinon
floor((floor(abs(zipcode)))/abs(zipcode))
Je l’ai fait en utilisant une instruction Case: int)
Pourquoi ne pas simplement utiliser ce qui suit? Je ne peux pas voir pour trouver des cas où il échoue.
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
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
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
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
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