SQL Server de la fonction ISNUMERIC
J'ai besoin de vérifier une colonne numérique ou pas dans SQL Server 2012.
Ce mon cas code.
CASE
WHEN ISNUMERIC(CUST_TELE) = 1
THEN CUST_TELE
ELSE NULL
END AS CUSTOMER_CONTACT_NO
Mais quand le '78603D99'
valeur est atteinte, il retourne 1
qui signifie SQL Server considéré cette chaîne numérique.
Pourquoi est-ce?
Comment faire pour éviter ce genre de problèmes?
ISNUMERIC
répond à la question que personne ne veut poser "cette chaîne Peut être converti à aucun type de données numérique (je n'ai pas entretien les types et je ne veux pas que vous me dites)?". 78603D99 est une chaîne valide qui peut être converti en float
.OriginalL'auteur weeraa | 2015-08-21
Vous devez vous connecter pour publier un commentaire.
Malheureusement, la
ISNUMERIC()
fonction dans SQL Server a beaucoup de bizarreries. Ce n'est pas exactement le buggy, mais il le fait rarement ce que les gens attendent à lors de leur première utilisation.Cependant, puisque vous êtes à l'aide de SQL Server 2012, vous pouvez utiliser le
TRY_PARSE()
qui permet de faire ce que vous voulez.Cette méthode retourne NULL:
SELECT TRY_PARSE('7860D399' AS int)
Cela renvoie 7860399
SELECT TRY_PARSE('7860399' AS int)
https://msdn.microsoft.com/en-us/library/hh213126.aspx
Évidemment, cela fonctionne pour les types de données autres que
INT
. Vous dites que vous voulez vérifier qu'une valeur est numérique, mais je pense que tu veux direINT
.NULL
plutôt que0
ouFALSE
. Ceci est important si vous ne voulez pas accidentellement exclure0
'partir de vos résultats.Notez que cette déclaration est vraie pour les nombres négatifs et les limites de la longueur de la chaîne.
vous pouvez également utiliser
TRY_CAST
. (commeTRY_PARSE
n'est pas un Natif SQL fonction, c'est plutôt une .NET au moment de l'exécution dépendant de la fonction. Aussi, il peut être plus forte pour les types de données spéciaux comme date-heure, mais il a probablement plus de performances frais généraux)OriginalL'auteur Paul Spangle
Bien que
try_convert()
outry_parse()
travaille pour un type, il ne pourrait pas faire exactement ce que vous voulez. Par exemple, il peut autoriser les points décimaux, les signes négatifs, et de limiter la longueur de chiffres.Aussi,
isnumeric()
va reconnaître les nombres négatifs, les décimales, et la notation exponentielle.Si vous voulez tester une chaîne uniquement pour les chiffres, vous pouvez utiliser
not like
logique:Cela dit simplement que
CUST_TELE
contient pas de caractères qui ne sont pas des chiffres.TRY_PARSE
ne peut pas faire exactement ce que vous voulez? Pouvez-vous donner un exemple?OriginalL'auteur Gordon Linoff
Rien d'important à ajouter, mais quelques mises en garde.
1) ISNUMERIC() ne prends pas les blancs, mais ils se casseront conversions numériques.
2) S'il y a un caractère non numérique dans le domaine et que vous utilisez REMPLACER pour se débarrasser de lui, vous avez encore besoin pour gérer le vide (généralement avec une instruction de CAS).
Par exemple, si le champ contient un seul caractère '-' et que vous utilisez ce:
il va échouer et vous aurez besoin d'utiliser quelque chose comme ceci:
OriginalL'auteur screechOwl